题目链接:http://mozhu.today/#/problem/show/1059
题解:
区间更新单点查询,裸裸的树状数组/线段树
考虑到m范围太大,所以要离散化
因为是单点修改,所以没有涉及到的点是不需要管的
将所有修改和询问记录下来离线处理,离散化之后正常做就好了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=200010;
int tree[N],n,m,l[N],r[N],v[N],ask[N],tot;
int a[N<<1];
bool aa[N];
int lowbit(int x)
{
return x&(-x);
}
void add(int pos,int val)
{
for(int i=pos;i;i-=lowbit(i))
tree[i]+=val;
}
int sum(int pos)
{
int ret=0;
for(int i=pos;i<=tot;i+=lowbit(i))
ret+=tree[i];
return ret;
}
int main()
{
int tmp,cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&tmp);
if(tmp==0)
{
scanf("%d%d%d",&l[i],&r[i],&v[i]);
a[++cnt]=l[i];a[++cnt]=r[i];
aa[i]=1;
}
else
{
scanf("%d",&ask[i]);
a[++cnt]=ask[i];
}
}
sort(a+1,a+cnt+1);
tot=unique(a+1,a+cnt+1)-a-1;
for(int i=1;i<=m;i++)
{
if(aa[i])
{
l[i]=lower_bound(a+1,a+tot+1,l[i])-a;
r[i]=lower_bound(a+1,a+tot+1,r[i])-a;
}
else ask[i]=lower_bound(a+1,a+tot+1,ask[i])-a;
}
// for(int i=1;i<=m;i++)
// if(aa[i]) cout<<l[i]<<" "<<r[i]<<endl;
// else cout<<ask[i]<<endl;
for(int i=1;i<=m;i++)
{
if(aa[i])
{
add(l[i]-1,-v[i]);
add(r[i],v[i]);
}
else printf("%d\n",sum(ask[i]));
}
return 0;
}