洛谷P3374(线段树)(询问区间和,支持单点修改)

洛谷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 }

 

posted @ 2019-07-30 14:45  Klaier  阅读(201)  评论(0编辑  收藏  举报