https://www.luogu.com.cn/problem/P3368
#include<cstdio>
#include<iostream>
using namespace std;
const int N=5e5+10;
int n;
int A[N],C[N],tree[N];
inline int lowbit(int x) {
return x&-x;
}
inline int read() {
char c=getchar();
int s=0,w=1;
while(c<'0' || c>'9') {
if(c=='-') w*=-1;
c=getchar();
}
while(c>='0' && c<='9') s=(s<<3)+(s<<1)+c-'0',c=getchar();
return s*w;
}
void updata(int x,int delta) {
while(x<=n) {
tree[x]+=delta;
x+=lowbit(x);
}
}
inline void init() {
for(int i=1; i<=n; i++) {
A[i]=read();
C[i]=A[i]-A[i-1];
updata(i,C[i]);
}
}
void updataRange(int l,int r,int delta) { //C[L]+delta C[R+1]-delta
updata(l,delta);
updata(r+1,-delta);
}
int query(int x) {
int s=0;
while(x>0) {
s+=tree[x];
x-=lowbit(x);
}
return s;
}
int main() {
n=read();
int m=read();
init();
for(int i=1; i<=m; i++) {
int a=read();
if(a==1) {
int x=read(),y=read(),k=read();
updataRange(x,y,k);
} else {
int x=read();
cout<<query(x)<<endl;
}
}
return 0;
}