#include<iostream> #include<cstdio> using namespace std; struct tree{ int l,r,sum; }tr[400001]; int n,m,a[100001]; void build(int k,int s,int t) { tr[k].l=s;tr[k].r=t; if(s==t){tr[k].sum=a[s];return;} int mid=(s+t)>>1; build(k<<1,s,mid); build(k<<1|1,mid+1,t); tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum; } int sum(int k,int s,int t) { int l=tr[k].l,r=tr[k].r; if(s==l&&r==t)return tr[k].sum; int mid=(l+r)>>1; if(t<=mid)return sum(k<<1,s,t); if(s>mid)return sum(k<<1|1,s,t); else return (sum(k<<1,s,mid)+sum(k<<1|1,mid+1,t)); } void update(int k,int x,int y) { tr[k].sum+=y; int l=tr[k].l,r=tr[k].r; if(l==r)return; int mid=(l+r)>>1; if(x<=mid)update(k<<1,x,y); else update(k<<1|1,x,y); } int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; build(1,1,n); cin>>m; for(int i=1;i<=m;i++){ int temp,a,b; cout<<endl; cin>>temp>>a>>b; if(temp==1)update(1,a,b); if(temp==2)cout<<sum(1,a,b)<<endl; } return 0; }
【wikioi1080】 线段树练习
最新推荐文章于 2017-03-11 08:48:00 发布