板子题:
区间修改,单点查询,样例都没过
本来想肝主席树结果发现树状数组都打崩了,我太蒟了
#include<bits/stdc++.h>
#define mian main
#define QWQ puts("QWQ");
using namespace std;
int n, m;
int tree[500005];
int lowbit(int x)//求lowbit:2进制下末尾0的个数。可表示tree中包含数据数量
{
return x & -x;
}
void _add(int x, int k)
{
for(;x <= n; x += lowbit(x))
tree[x] += k;
}
long long _find(int x)
{
long long ans = 0;
for(;x > 0; x -= lowbit(x))
ans += tree[x];
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++)
{
long long k, lk = 0;
scanf("%lld", &k);
_add(i, k - lk);
lk = k;//差分
}
for(int i = 1; i <= m; i ++)
{
int p;
long long x, y, k;
scanf("%d", &p);
if(p == 1)
{
scanf("%lld%lld%lld", &x, &y, &k);
_add(x, k);
_add(y + 1, -k);//修改头尾。因为中间差未变
}
else
{
scanf("%lld", &x);
printf("%lld\n", _find(x));//因为是差分所以前x项差分和就为所求数
}
}
return 0;
}