code:
#include<iostream>
#include<set>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
const int MOD = 1e9 + 7;
const int N = 5e5 + 5;
int n, m, seed, vmax, a[N];
struct Node {
int l, r;
mutable int v;
Node(int l, int r = 0, int v = 0): l(l), r(r), v(v) {};
bool operator < (const Node &a) const {
return l < a.l;
}
};
std::set<Node> s;
std::set<Node>::iterator split(int pos) {
std::set<Node>::iterator it = s.lower_bound(Node(pos));
if(it != s.end() && it -> l == pos) return it;
it--;
if(it -> r < pos) return s.end();
int l = it -> l, r = it -> r, v = it -> v;
s.erase(it);
s.insert(Node(l, pos - 1, v));
return s.insert(Node(pos, r, v)).first;
}
void assign(int l, int r, int x) {
std::set<Node>::iterator itr = split(r + 1);
std::set<Node>::iterator itl = split(l);
s.erase(itl, itr);
s.insert(Node(l, r, x));
}
void add(int l, int r, int x) {
std::set<Node>::iterator itr = split(r + 1);
std::set<Node>::iterator itl = split(l);
for(std::set<Node>::iterator it = itl; it != itr; ++it)
it -> v += x;
}
int query(int x) {
std::set<Node>::iterator it = s.lower_bound(Node(x));
return a[x] + (it -> v);
}
signed main() {
cin>>n>>m;
int q,x,y,k;
for(int i=1;i<=n;i++){
scanf("%lld",a+i);
}
s.insert(Node(0,N,0));
for(int i=1;i<=m;i++){
scanf("%lld",&q);
if(q==1){
scanf("%lld%lld%lld",&x,&y,&k);
add(x,y,k);
}
if(q==2){
scanf("%lld",&x);
cout<<query(x)<<endl;
}
}
}