TZOJ 3198: 区间和

描述

给定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 }
View Code

对原理还不是很懂 天梯赛之后在来研究^-^

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/10580387.html