莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 预处理差分数组
2. 每次查询一个数时,只需要求一遍该差分数组的前缀和即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int n,m;
int a[N];
LL tr[N];
int lowbit(int x)
{
return x&-x;
}
//修改操作
void add(int x,int c)
{
for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=c;
}
//查询操作, sum[x] = a[1] + a[2] + …… + a[x]
LL sum(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i)) res+=tr[i];
return res;
}
int main()
{
cin>>n>>m;
//预处理差分数组
for(int i=1;i<=n;i++)
{
cin>>a[i];
add(i,a[i]-a[i-1]);
}
while(m--)
{
//输入操作
char op;
cin>>op;
//第一类指令
if(op=='C')
{
int l,r,d;
cin>>l>>r>>d;
//差分数组基本操作
add(l,d);
add(r+1,-d);
}
//第二类指令
else
{
int x;
cin>>x;
//输出前缀和
cout<<sum(x)<<endl;
}
}
return 0;
}