题目链接:https://www.acwing.com/problem/content/248/
给定长度为N的数列A,然后输入M行操作指令。
第一类指令形如“C l r d”,表示把数列中第l~r个数都加d。
第二类指令形如“Q X”,表示询问数列中第x个数的值。
对于每个询问,输出一个整数表示答案。
输入格式
第一行包含两个整数N和M。
第二行包含N个整数A[i]。
接下来M行表示M条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
1≤N,M≤1051≤N,M≤105,
|d|≤10000|d|≤10000,
|A[i]|≤1000000000|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
时/空限制:1s / 64MB
思路:利用树状数组对该变量进行记录,输出时用原数字加上该变量即可.
#include<iostream>
#define ll long long
using namespace std;
const int N = 100000 + 10;
ll a[N],tree[N];
ll n;
ll lowbit(ll x)
{
return x & -x;
}
ll query(ll x)
{
ll ans = a[x];
for(ll i=x; i>=1; i-=lowbit(i))
ans += tree[i];
return ans;
}
void add(ll x, ll val)
{
for(int i=x; i<=n; i+=lowbit(i))
tree[i] += val;
}
int main()
{
int m;
cin>>n>>m;
for(ll i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
}
char c;
while(m--)
{
getchar();
cin>>c;
if(c == 'Q')
{
int x;
cin>>x;
cout<<query(x)<<endl;
}
else
{
ll l, r, val;
cin>>l>>r>>val;
add(l, val);
add(r+1, -1 * val);
}
}
return 0;
}
//10 5
//16 -12 -16 -5 11 14 7 -3 -19 2
//C 5 8 -6
//Q 3
//C 7 8 -1
//C 1 10 10
//Q 4