#include<bits/stdc++.h>
using namespace std;
const int N=114514;
const int INF=1e9+7;
int n,cnt,b[N],id[N];
int a[N],la[N];
int s[N];
void init(int n){
int k,i;
k=sqrt(n);
for(i=0;i<n;i++){
if(i%k==0)id[i/k+1]=i+1;
b[i+1]=i/k+1;
}
id[(n-1)/k+2]=n+1;
cnt=(n-1)/k+1;
}
void build(int x){
int i;
for(i=id[x];i<id[x+1];i++)a[i]+=la[x];
la[x]=0;
for(i=id[x];i<id[x+1];i++)s[i]=a[i];
sort(s+id[x],s+id[x+1]);
}
int query(int x,int c){
int *k=upper_bound(s+id[x],s+id[x+1],c-la[x]);
return k-s-id[x];
}
int main(){
int i,q,op,l,r,ans,c,tl,tr,mid,ct;
scanf("%d%d",&n,&q);init(n);
for(i=1;i<=n;i++)scanf("%d",a+i);
for(i=1;i<=cnt;i++)build(i);
while(q--){
scanf("%d%d%d%d",&op,&l,&r,&c);
if(op==2){
if(b[r]==b[l]){
for(i=l;i<=r;i++)a[i]+=c;
build(b[l]);
}else{
for(i=l;i<id[b[l]+1];i++)a[i]+=c;
for(i=id[b[r]];i<=r;i++)a[i]+=c;
for(i=b[l]+1;i<b[r];i++)la[i]+=c;
build(b[l]);build(b[r]);
}
}else{
if(c<1||c>(r-l+1))printf("-1");
else if(b[r]==b[l]){
tl=-200000;tr=200000;
while(tl<=tr){
mid=(tl+tr)/2;ct=0;
for(i=l;i<=r;i++)if(a[i]+la[b[i]]<=mid)ct++;
if(ct<c)tl=mid+1;
else tr=mid-1,ans=mid;
}
printf("%d\n",ans);
}else{
tl=-200000;tr=200000;
while(tl<=tr){
mid=(tl+tr)/2;ct=0;
for(i=l;i<id[b[l]+1];i++)if(a[i]+la[b[l]]<=mid)ct++;
for(i=id[b[r]];i<=r;i++)if(a[i]+la[b[r]]<=mid)ct++;
for(i=b[l]+1;i<b[r];i++)ct+=query(i,mid);
if(ct<c)tl=mid+1;
else tr=mid-1,ans=mid;
}
printf("%d\n",ans);
}
}
}
return 0;
}