描述
给定n个数据,有两个操作,加减其中的一个数据,当然还可查询在某段数据的和。
输入
输入数据有多组,每组数据的
第一行输入n,1=<n<=500000,代表数据的个数。
第二行输入具体数据,数据为正整数,范围在1到10000.
第三行输入m,1<=m<=100000,表示操作的次数。包含了修改和查询操作。
下面m行就是具体的操作了。
C i x 表示为第i个元素加上x,x范围在1到10000.
Q i j 表示查询区段i到j的和。保证输入的i<=j.
以EOF结束。
输出
输出查询后的区段和。
样例输入
样例输出
提示
提示:类型最好定义为__int64
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef int64_t ll; 4 const int N=500005; 5 int n; 6 ll c[N]; 7 int lowbit(int x) 8 { 9 return x&-x; 10 } 11 ll add(int x,int y) 12 { 13 while(x<=n) //x为下标,二叉树的编号 14 { 15 c[x]+=y; 16 x+=lowbit(x); 17 } 18 } 19 ll sum(int x) 20 { 21 ll ans=0; 22 while(x>0) 23 { 24 ans+=c[x]; 25 x-=lowbit(x); 26 } 27 return ans; 28 } 29 int main() 30 { 31 ios::sync_with_stdio(false); 32 int d,m; 33 while(cin>>n) 34 { 35 memset(c,0,sizeof(c)); 36 for(int i=1;i<=n;i++) 37 { 38 cin>>d; 39 add(i,d); 40 } 41 cin>>m; 42 while(m--) 43 { 44 char s;int a,b; 45 cin>>s>>a>>b; 46 if(s=='Q') 47 cout << sum(b)-sum(a-1) << endl; 48 else add(a,b); 49 } 50 } 51 return 0; 52 }
对原理还不是很懂 天梯赛之后在来研究^-^