给定长度为N的数列A,然后输入M行操作指令。
第一类指令形如“C l r d”,表示把数列中第l~r个数都加d。
第二类指令形如“Q X”,表示询问数列中第x个数的值。
对于每个询问,输出一个整数表示答案。
输入格式
第一行包含两个整数N和M。
第二行包含N个整数A[i]。
接下来M行表示M条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
1≤N,M≤105
,
|d|≤10000,
|A[i]|≤1000000000
输入样例:
10 5
1 2 3 4 5 6 7 8 9 10
Q 4
Q 1
Q 2
C 1 6 3
Q 2
输出样例:
4
1
2
5
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long c[100005];
long long a[100005];
int sum(int x)
{
int ans=0;
while(x>0)
{
ans+=c[x];
x-=(-x)&x;
}return ans;
}
void up(int x,int y)
{
while(x<=n)
{
c[x]+=y;
x+=(-x)&x;
}
}
int main()
{
cin>>n>>m;
char s[10];
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
while(m--)
{
long long p;
cin>>s;
if(s[0]=='Q')
{cin>>p;
cout<<sum(p)+a[p]<<endl;
}
else
{
long long qq,q;cin>>p>>q>>qq;
up(p,qq);
up(q+1,-qq);
}
}
}