首页 > 代码库 > 南阳116----士兵杀敌(二)

南阳116----士兵杀敌(二)

 1 //线段树入门,单点修改,区间查询
 2 #include <cstdio>
 3 const int maxn = 3*1e6+5;
 4 struct node
 5 {
 6     int l,r;
 7     node *pl, *pr;
 8     int s;
 9 };
10 node t[maxn];
11 int cnt = 0;
12 int mid(node *p)
13 {
14     return (p->l + p->r)/2;
15 }
16 void build(node *p,int l,int r)
17 {
18     p->l = l; p->r = r;
19     p->s = 0;
20     if(l == r) return;
21     p->pl = t + ++cnt;
22     p->pr = t + ++cnt;
23     build(p->pl,l,(l+r)/2);
24     build(p->pr,(l+r)/2+1,r);
25 }
26 void insert(node *p,int i,int v)
27 {
28     p->s += v;
29     if(p->l == i && p->r == i) return;
30     if(i > mid(p)) insert(p->pr,i,v);
31     else insert(p->pl,i,v);
32     //p->s += p->pl->s + p->pr->s;
33 }
34 int query(node *p,int l,int r)
35 {
36     if(p->l == l && p->r == r) return p->s;
37     if(r <= mid(p)) return query(p->pl,l,r);
38     else if(l > mid(p)) return query(p->pr,l,r);
39     else return query(p->pl,l,mid(p)) + query(p->pr,mid(p)+1,r);
40 }
41 int main()
42 {
43     int n,m,x,y,z;
44     char op[20];
45     scanf("%d%d",&n,&m);
46     build(t,1,n);
47     for(int i = 1; i <= n; ++i)
48     {
49         scanf("%d",&x);
50         insert(t,i,x);
51     }
52     while(m--)
53     {
54         scanf("%s%d%d",op,&x,&y);
55         if(op[0] == Q)
56             printf("%d\n",query(t,x,y));
57         else
58             insert(t,x,y);
59     }
60     return 0;
61 }

 

南阳116----士兵杀敌(二)