洛谷——P2068 统计和

https://www.luogu.org/problem/show?pid=2068#sub

题目描述

给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区间的和。时间限制1秒。

输入输出格式

输入格式:

 

第一行1个数,表示序列的长度n

第二行1个数,表示操作的次数w

后面依次是w行,分别表示加入和询问操作

其中,加入用x表示,询问用y表示

x的格式为"x a b" 表示在序列a的位置加上b

y的格式为"y a b" 表示询问a到b区间的加和

 

输出格式:

 

每行一个数,分别是每次询问的结果

 

输入输出样例

输入样例#1:
5
4
x 3 8
y 1 3
x 4 9
y 3 4
输出样例#1:
8
17

 1 #include <algorithm>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int n,w,a,b;
 7 char x_y;
 8 
 9 struct TypeNodeTree
10 {
11     int l,r,mid,dis,flag;
12 }tree[10015*4];
13 
14 void tree_up(int now)
15 {
16     tree[now].dis=tree[now*2].dis+tree[now*2+1].dis;
17     return ;
18 } 
19 
20 void tree_build(int now,int l,int r)
21 {
22     tree[now].l=l; tree[now].r=r;
23     tree[now].mid=(tree[now].l+tree[now].r)/2;
24     if(l==r)
25     {
26         tree[now].dis=0;
27         return ;
28     }
29     tree_build(now*2,l,tree[now].mid);
30     tree_build(now*2+1,tree[now].mid+1,r);
31     tree_up(now);
32 }
33 
34 void tree_change(int now,int to,int add)
35 {
36     if(tree[now].l==tree[now].r)
37     {
38         tree[now].dis+=add;
39         return ;
40     }
41     int mid=(tree[now].l+tree[now].r)/2;
42     if(mid<to) tree_change(now*2+1,to,add);
43     else          tree_change(now*2,to,add);
44     tree_up(now);
45 }
46 
47 int tree_query(int now,int l,int r)
48 {
49     if(tree[now].l==l&&tree[now].r==r)
50         return tree[now].dis;
51     int mid=(tree[now].l+tree[now].r)/2;
52     if(l>mid) return tree_query(now*2+1,l,r);
53     else if(r<=mid) return tree_query(now*2,l,r);
54     else return tree_query(now*2,l,mid)+tree_query(now*2+1,mid+1,r);
55 }
56 
57 int main()
58 {
59     cin>>n>>w;
60     tree_build(1,1,n);
61     for(int i=1;i<=w;i++)
62     {
63         cin>>x_y>>a>>b;
64         if(x_y=='x') tree_change(1,a,b);
65         else cout<<tree_query(1,a,b)<<endl;
66     }
67     return 0;
68 }

 

posted @ 2017-04-22 22:02  Aptal丶  阅读(208)  评论(0编辑  收藏  举报