代码连样例都没过但是AC
#include <bits/stdc++.h>
using namespace std;
int n,q;
int a[1000010];
struct node{
int l,r,v,t;
}f[4000010];
inline void pushdown(int i){
if (f[i].t>0){
f[i*2].t+=f[i].t;
f[i*2+1].t+=f[i].t;
f[i*2].v+=f[i].t*(f[i*2].r-f[i*2].l+1);
f[i*2+1].v+=f[i].t*(f[i*2+1].r-f[i*2+1].l+1);
f[i].t=0;
}
}
inline void pushup(int i){
f[i].v=f[i*2].v+f[i*2+1].v;
}
void build(int i,int l,int r){
f[i].l=l;
f[i].r=r;
if (l==r){
f[i].v=a[l];
return;
}
int mid=(l+r)>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
f[i].v=f[i*2].v+f[i*2+1].v;
}
void update(int i,int l,int r,int x){
if (f[i].r<l || r<f[i].l){
return;
}
if (l<=f[i].l && f[i].r<=r){
f[i].v+=(f[i].r-f[i].l+1)*x;
f[i].t+=x;
return ;
}
pushdown(i);
if (l<=f[i*2].r) update(i*2,l,r,x);
if (f[i*2+1].l<=r) update(i*2+1,l,r,x);
pushup(i);
}
int get(int i,int l,int r){
if (l>r) swap(l,r);
if (f[i].r<l || r<f[i].l){
return 0;
}
if (l<=f[i].l && f[i].r<=r){
return f[i].v;
}
pushdown(i);
return get(i*2,l,r)+get(i*2+1,l,r);
}
int main(){
int n,q;
scanf("%d%d",&n,&q);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
while(q--){
int c;
scanf("%d",&c);
if (c==1){
int x,y,k;
scanf("%d %d %d",&x,&y,&k);
update(1,x,y,k);
}
else{
int p;
scanf("%d",&p);
printf("%d\n",get(1,p,p));
}
}
return 0;
}