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 }