#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
inline ll read(){
ll x=0;
short f=1;
char c=getchar();
while(c>57||c<48){
if(c==45) f=-1;
c=getchar();
}
while(c<58&&c>47){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
inline void write(ll x){
if(x>>63) putchar(45),x=~x+1;
if(9-x>>63) write(x/10);
putchar(x%10|48);
}
int n=read(),m=read();
int rt[2000005],ct[50000005],ls[50000005],rs[50000005],cnt,I=1;
#define pu(id) ct[id]=ct[ls[id]]+ct[rs[id]];
void addv(int p,int v,int &id,int nl=1,int nr=100000){
if(!id) id=++cnt;
if(nl==nr){
ct[id]+=v;
return;
}
if(p<=nl+nr>>1) addv(p,v,ls[id],nl,nl+nr>>1);
else addv(p,v,rs[id],(nl+nr>>1)+1,nr);
pu(id);
}
int merge(int a,int b,int nl=1,int nr=100000){//merge a and b
if(!a||!b) return a|b;
if(nl==nr){
ct[a]+=ct[b];
return a;
}
ls[a]=merge(ls[a],ls[b],nl,nr+nl>>1);
rs[a]=merge(rs[a],rs[b],(nl+nr>>1)+1,nr);
pu(a);
return a;
}
void split(int &fr,int &to,int ql,int qr,int nl=1,int nr=100000){
if(!fr) return;
if(!to) to=++cnt;
if(qr<nl||nr<ql) return;
if(ql<=nl&&nr<=qr){
to=fr;
fr=0;
}
if(nl==nr) return;
split(ls[fr],ls[to],ql,qr,nl,nl+nr>>1);
split(rs[fr],rs[to],ql,qr,(nl+nr>>1)+1,nr);
pu(fr);
pu(to);
}
int find(int id,int ql,int qr,int nl=1,int nr=100000){
if(nr<ql||nl>qr||!id) return 0;
if(ql<=nl&&nr<=qr) return ct[id];
return find(ls[id],ql,qr,nl,nl+nr>>1)+find(rs[id],ql,qr,(nl+nr>>1)+1,nr);
}
int kth(int id,int p,int nl=1,int nr=100000){
if(nl==nr) return nl;
if(ct[ls[id]]<p) return kth(rs[id],p-ct[ls[id]],(nl+nr>>1)+1,nr);
else return kth(ls[id],p,nl,nl+nr>>1);
}
signed main(){
for(int i=1;i<=n;i++){
int x=read();
if(x){
addv(i,x,rt[1]);
}
}
for(int i=1;i<=m;i++){
int op=read(),p=read(),x=read();
// printf("ORDER %d,(%d)\n",op,p);
if(op==0){
split(rt[p],rt[++I],x,read());
}
if(op==1){
rt[p]=merge(rt[p],rt[x]);
}
if(op==2){
addv(read(),x,rt[p]);
}
if(op==3){
write(find(rt[p],x,read()));putchar(10);
}
if(op==4){
write(ct[rt[p]]<x?-1:kth(rt[p],x));putchar(10);
}
// for(int i=1;i<=I;i++){
// printf("%d-%d",i,ct[rt[i]]);
// for(int j=1;j<=ct[rt[i]];j++) printf("%d ",kth(rt[i],j));
// putchar(10);
// }
}
}
rt