样例可过
#include<bits/stdc++.h>
using namespace std;
const int X=2000010;
int n,m,cnt=0,st[X];
struct point
{
int ls,rs,sum,ln,rn;
} p[X];
point _point(int _ls,int _rs,int _sum,int _ln,int _rn)
{
point tmp;
tmp.ls=_ls,tmp.rs=_rs,tmp.sum=_sum,tmp.ln=_ln,tmp.rn=_rn;
return tmp;
}
int build(int _l,int _r)
{
if(_l==_r)
{
p[++cnt]=_point(-1,-1,st[_l],_l,_r);
return cnt;
}
int m=(_l+_r)/2,ncnt=++cnt;
int nls=build(_l,m),nrs=build(m+1,_r);
p[ncnt]=_point(nls,nrs,0,_l,_r);
return ncnt;
}
void Add(int nx,int ny,int k,int now)
{
if(nx<=p[now].ln&&ny>=p[now].rn)
{
p[now].sum+=k;
return ;
}
int m=(p[now].ln+p[now].rn)/2;
if(nx<=m) Add(nx,m,k,p[now].ls);
if(m+1<=ny) Add(m+1,ny,k,p[now].rs);
return ;
}
void Print(int x,int now,int added)
{
if(p[now].ln==p[now].rn&&p[now].rn==x)
{
printf("%d\n",added+p[now].sum);
return ;
}
int m=(p[now].ln+p[now].rn)/2;
if(x<=m) Print(x,p[now].ls,added+p[now].sum);
else Print(x,p[now].rs,added+p[now].sum);
return ;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>st[i];
build(1,n);
while(m--)
{
int s;
cin>>s;
if(s==1)
{
int x,y,k;
cin>>x>>y>>k;
Add(x,y,k,1);
}
else
{
int x;
cin>>x;
Print(x,1,0);
}
}
return 0;
}
只对了1,3,4