#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define MAXM (1000000+10)
int n,m;
/*
struct tree_arr
{
int a[MAXM*4];
tree_arr(){memset(a,0,sizeof(a));}
void inc(int x,int c)
{
for(int i=x;i<=n;i+=i&(-i)) a[x]+=c;
}
int qur(int x)
{
int ans=0;
for(int i=x;i;i-=i&(-i)) ans+=a[x];
return ans;
}
}T1,T2;
void Ins()
{
}*/
int a[MAXM],tmp=0;
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin>>n>>m;
For(i,n) {scanf("%d",&a[i]);}
For(i,m)
{
int type;
scanf("%d",&type);
if (type==1)
{
int v,x;
scanf("%d%d",&v,&x);
a[v]+=x-(a[v]+tmp);
}
else if (type==2)
{
int w;
cin>>w;
tmp+=w;
}
else
{
int v;
scanf("%d",&v);
cout<<a[v]+tmp<<endl;
}
}
return 0;
}