当成模板用就行
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define re register int
#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
using namespace std;
const int mod=1e9+7;
const int M=1e8+5;
const int N=2e5+5;//?????????? 4e8
struct node
{
int l,r,sum;
}e[N*40];
int tot,rt[N];
void push(int p)
{
e[p].sum=e[e[p].l].sum+e[e[p].r].sum;
}
void change(int &p,int l,int r,int pos,int x)
{
if(!p) p=++tot;
e[p].sum+=x;
if(l==r) return;
int mid=(l+r)>>1;
if(pos<=mid) change(e[p].l,l,mid,pos,x);
else change(e[p].r,mid+1,r,pos,x);
}
void merge(int &x,int y)
{
if(!(x&&y)) x|=y;
else
{
e[x].sum+=e[y].sum;
merge(e[x].l,e[y].l);
merge(e[x].r,e[y].r);
}
}
int split(int &p,int L,int R,int l,int r)
{
int n=++tot;
if(L<=l&&r<=R)
{
e[n]=e[p];
p=0;
}
else
{
int mid=(l+r)>>1;
if(L<=mid) e[n].l=split(e[p].l,L,R,l,mid);
if(mid<R) e[n].r=split(e[p].r,L,R,mid+1,r);
push(p);push(n);
}
return n;
}
int ask(int p,int L,int R,int l,int r)
{
if(L<=l&&r<=R) return e[p].sum;
int mid=(l+r)>>1;
int ans=0;
if(L<=mid) ans+=ask(e[p].l,L,R,l,mid);
if(mid<R) ans+=ask(e[p].r,L,R,mid+1,r);
return ans;
}
int ask(int p,int l,int r,int k)
{
if(l==r) return l;
int mid=(l+r)>>1;
int t=e[e[p].l].sum;
if(k<=t) return ask(e[p].l,l,mid,k);
return ask(e[p].r,mid+1,r,k-t);
}
void solve()
{
int n,m;
cin>>n>>m;
for(re i=1;i<=n;i++)
{
int x;
scanf("%lld",&x);
change(rt[1],1,n,i,x);
}
int last=1;
while(m--)
{
int op,x,y,z;
scanf("%lld%lld%lld",&op,&x,&y);
if(op==0)
{
scanf("%lld",&z);
rt[++last]=split(rt[x],y,z,1,n);
}
else if(op==1) merge(rt[x],rt[y]);
else if(op==2)
{
scanf("%lld",&z);
change(rt[x],1,n,z,y);
}
else if(op==3)
{
scanf("%lld",&z);
printf("%lld\n",ask(rt[x],y,z,1,n));
}
else
{
if(y>e[rt[x]].sum) puts("-1");
else printf("%lld\n",ask(rt[x],1,n,y));
}
}
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
// printf("Case %d:\n",index);
solve();
// puts("");
}
return 0;
}
/*
1
6 5
0 0 0 122 499 8888
*/