码迷,mamicode.com
首页 > 其他好文 > 详细

函数式线段树

时间:2017-10-19 14:09:52      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:blog   for   nod   null   getchar   [1]   return   build   vector   

#include <bits/stdc++.h>
using namespace std;
struct Node{
    int l,r,n;
    Node *son[2];
};
int a[10005];
vector<Node*> root;
void build(Node *&o,int l,int r){
int mid=(l+r)>>1;
    o=new Node;
    o->l=l;o->r=r;
    if(l==r){
        o->son[0]=o->son[1]=NULL;
        o->n=a[l];
        return;
    }
    build(o->son[0],l,mid);
    build(o->son[1],mid+1,r);
    o->n=o->son[0]->n+o->son[1]->n;
}
void update(Node *&o,int w,int n){
int mid=(o->l+o->r)>>1;
Node *t=new Node;
    *t=*o;
    o=t;
    o->n+=n;
    if(o->l==o->r)
        return;
    if(w>mid)
        update(o->son[1],w,n);
    else
        update(o->son[0],w,n);
}
int query(Node *o,int l,int r){
	if(o==NULL){
		puts("WORNG");
		getchar();getchar();
	}
int mid=(o->l+o->r)>>1;
    if(o->l==l&&o->r==r)
        return o->n;
    if(mid>=r)
        return query(o->son[0],l,r);
    else if(mid<l)
        return query(o->son[1],l,r);
    else
        return query(o->son[0],l,mid)+query(o->son[1],mid+1,r);
}
int main(){
Node *now=NULL;
int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    build(now,1,n);
    while(1){
        int a;
        cin>>a;
        if(a==1){
            int w,n;
            cin>>w>>n;
            root.push_back(now);
            update(now,w,n);
        }
        if(a==2){
            int l,r;
            cin>>l>>r;
            cout<<query(now,l,r)<<endl;
        }
        if(a==3){
            int n;
            cin>>n;
            now=root[n];
        }
    }
    return 0;
}

  

函数式线段树

标签:blog   for   nod   null   getchar   [1]   return   build   vector   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7691933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!