洛谷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
",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
",query(1,x,y));
63 }
64 return 0;
65 }