#include<bits/stdc++.h>
namespace IO{
template<typename T> inline void write(T x) {
if(x<0) putchar('-'),x=-x;
if(!x){
putchar('0');
return ;
}
if(x>9) write(x/10);
putchar(x%10+'0');
return ;
}
template<typename T> inline void read(T &x) {
int w = 1;
char ch = getchar();
x=0;
while(!isdigit(ch)){
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x*=w;
return ;
}
}
using namespace IO;
using namespace std;
int x[100005],n,m,els,i,j,z[100005],L[100005],R[100005],num[100005],y[100005],tag[100005],legth=350,gnum;
inline void build(){
gnum=n/legth;
for(i=1;i<=gnum;++i){
L[i]=R[i-1]+1;
R[i]=L[i]+legth-1;
}
if(R[gnum]!=n){
L[gnum+1]=R[gnum]+1;
++gnum;
R[gnum]=n;
}
for(i=1;i<=gnum;++i){
for(int j=L[i];j<=R[i];++j){
num[j]=i;
y[j]=x[j];
}
sort(y+L[i],y+R[i]+1);
}
return;
}
inline void up(int l,int r,int val){
int bl=num[l],br=num[r];
if(bl==br){
for(i=l;i<=r;++i)x[i]=x[i]+val;
for(i=L[bl];i<=R[br];++i)y[i]=x[i];
sort(y+L[bl],y+R[bl]+1);
return;
}
for(i=l;i<=R[bl];++i)x[i]=x[i]+val;
for(i=L[bl];i<=R[bl];++i)y[i]=x[i];
sort(y+L[bl],y+R[bl]+1);
for(i=bl+1;i<=br-1;++i)tag[i]=tag[i]+val;
for(i=L[br];i<=r;++i)x[i]=x[i]+val;
for(i=L[br];i<=R[br];++i)y[i]=x[i];
sort(y+L[br],y+R[br]+1);
return;
}
inline int query(int now,int k){
k=k-tag[now];
int l=L[now],r=R[now];
if(y[l]>k)return 0;
while(l<r){
int mid=((l+r)>>1)+((l+r)&1);
if(l==r-1)mid=r;
if(y[mid]>k)r=mid-1;
else l=mid;
}
return l-L[now]+1;
}
inline int mo(int k){
int l=1,r=els;
if(z[1]>k)return 0;
while(l<r){
int mid=((l+r)>>1)+((l+r)&1);
if(z[mid]>k)r=mid-1;
else l=mid;
}
return l;
}
inline int down(int l,int r,int k){
if(k<1||k>r-l+1)return -1;
int bl=num[l],br=num[r],lef=y[L[bl]]+tag[bl],rig=y[R[bl]]+tag[bl];
for(i=bl+1;i<=br;++i){
lef=min(lef,y[L[i]]+tag[i]);
rig=max(rig,y[R[i]]+tag[i]);
}
els=0;
if(num[l]==num[r])for(int i=l;i<=r;++i)z[++els]=x[i]+tag[bl];
else{
for(i=l;i<=R[bl];++i)z[++els]=x[i]+tag[bl];
for(i=L[br];i<=r;++i)z[++els]=x[i]+tag[br];
}
sort(z+1,z+els+1);
while(lef<rig){
int mid=((1ll*lef+rig)>>1),summ=mo(mid);
for(i=bl+1;i<=br-1;++i)summ=summ+query(i,mid);
if(summ<k)lef=mid+1;
else rig=mid;
}
return lef;
}
int main(){
read(n);
read(m);
for(i=1;i<=n;++i)read(x[i]);
build();
int kind,l,r,k;
for(int o=1;o<=m;++o){
read(kind);read(l);read(r);read(k);
if(kind==2)up(l,r,k);
else{write(down(l,r,k));putchar('\n');}
}
return 0;
}