#include <iostream>
#define MAX 100000
using namespace std;
class tree{
public:
struct node{
int l , r , sum , tag = 0;
};
vector<int> box;
node nodes[MAX];
int build(int i , int l , int r){
nodes[i].r = r, nodes[i].l = l;
if(l == r){
nodes[i].sum = box[l];
nodes[i].tag = box[l];
return nodes[i].sum;
}
int mid = (r+l)>>1;
return nodes[i].sum = build(2*i,l,mid) + build(2*i+1,mid+1,r);
}
tree(int size){
while(size--){
int a = 0;
cin >> a;
box.push_back(a);
}
int length = int(box.size());
build(1,0,length-1);
}
void modify(int l , int r , int k , int i){
if(nodes[i].r <= r && nodes[i].l >= l){
nodes[i].tag += k;
return;
}
int mid = (nodes[i].r + nodes[i].l)>>1;
if(l <= mid){
modify(l , r , k , 2*i);
}
if(mid < r){
modify(l , r , k , 2*i+1);
}
}
void add(){
int a , b , c;
cin >> a >> b >> c;
modify(a,b,c,1);
}
int query(int p , int x){
if(nodes[p].r == nodes[p].l){
return nodes[p].tag;
}
int mid = (nodes[p].r + nodes[p].l)>>1;
return x <= mid ? nodes[p].tag + query(2*p, x) : nodes[p].tag + query(2*p+1,x);
}
int query_pro(){
int target = 0;
cin >> target;
return query(1,target-1);
}
};
int main(){
int size , operations;
cin >> size >> operations;
tree op(size);
while(operations--){
int select = 0;
cin >> select;
if(select == 1){op.add();}
else{cout << op.query_pro() << endl;}
}
}