洛谷P3374(线段树)(询问区间和,支持单点修改)
1 //询问区间和,支持单点修改 2 #include <cstdio> 3 4 using namespace std; 5 6 const int maxn=500050; 7 8 struct treetype 9 { 10 int l,r,sum; 11 }; 12 13 treetype a[4*maxn]; 14 int num[maxn]; 15 16 void build(int k,int l,int r) 17 { 18 a[k].l=l;a[k].r=r; 19 if (l==r) 20 { 21 a[k].sum=num[l]; 22 return; 23 } 24 int mid=(l+r)>>1,i=k<<1; 25 build(i,l,mid); 26 build(i+1,mid+1,r); 27 a[k].sum=a[i].sum+a[i+1].sum; 28 } 29 void change(int k,int x,int t) 30 { 31 if (a[k].l==a[k].r) 32 { 33 a[k].sum+=t; 34 return; 35 } 36 int mid=(a[k].l+a[k].r)>>1,i=k<<1; 37 if (x<=mid) change(i,x,t); 38 else change(i+1,x,t); 39 a[k].sum=a[i].sum+a[i+1].sum; 40 } 41 int query(int k,int x,int y) 42 { 43 if (x<=a[k].l && a[k].r<=y) return a[k].sum; 44 int mid=(a[k].l+a[k].r)>>1,ans=0,i=k<<1; 45 if (x<=mid) ans=query(i,x,y); 46 if (mid<y) ans+=query(i+1,x,y); 47 return ans; 48 } 49 50 int main() 51 { 52 int n,m; 53 scanf("%d%d",&n,&m); 54 for (int i=1;i<=n;i++) scanf("%d",&num[i]); 55 build(1,1,n); 56 //for (int i=1;i<=n*2;i++) printf("%d %d %d %d\n",i,a[i].l,a[i].r,a[i].sum); 57 for (int i=1;i<=m;i++) 58 { 59 int t,x,y; 60 scanf("%d%d%d",&t,&x,&y); 61 if (t==1) change(1,x,y); 62 else printf("%d\n",query(1,x,y)); 63 } 64 return 0; 65 }