初学线段树的萌新疑惑中qwq
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int tree[4*N],a[N],add[4*N];
void build(int l,int r,int k){
if(l==r){
tree[k]=a[l];
return;
}
int mid=l+r>>1;
build(l,mid,2*k);
build(mid+1,r,2*k+1);
tree[k]=tree[k*2]+tree[2*k+1];
}
void change(int l,int r,int k,int v){
tree[k]+=v*(r-l+1);
add[k]+=v;
}
void down(int l,int r,int k){
if(add[k]!=0){
int mid=l+r>>1;
change(l,mid,2*k,add[k]);
change(mid+1,r,2*k+1,add[k]);
add[k]=0;
}
}
void update(int l,int r,int k,int x,int y,int v){
if(x<=l && y>=r){
change(l,r,k,v);
return;
}
down(l,r,k);
int mid=l+r>>1;
if(x<=mid) update(l,mid,2*k,x,y,v);
if(y>mid) update(mid+1,r,2*k+1,x,y,v);
tree[k]=tree[2*k]+tree[2*k+1];
}
int quary(int l,int r,int k,int x,int y){
if(l<=x && r<=y){
return tree[k];
}
down(l,r,k);
int mid=l+r>>1;
int res=0;
if(x<=mid) res+=quary(l,mid,k*2,x,y);
if(y>mid) res+=quary(mid+1,r,k*2+1,x,y);
return res;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
while(m--){
int p;
cin>>p;
if(p==1){
int x,y,k;
cin>>x>>y>>k;
update(1,n,1,x,y,k);
}else{
int x;
cin>>x;
cout<<quary(1,n,1,x,x)<<"\n";
}
}
return 0;
}