#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int p[N],a[N],lm[N],rm[N],pos[N],n,m,len,op,x,y,w,add[N],key;
inline int check(int l,int r,int v){
int ls=pos[l],rs=pos[r],res=0;
if(ls==rs){ for(int i=l;i<=r;i++) if(a[i]+add[pos[i]]<=v) res++;
return res;} for(int i=l;i<=rm[ls];i++) if(a[i]+add[pos[i]]<=v) res++;
for(int i=r;i>=lm[rs];i--) if(a[i]+add[pos[i]]<=v) res++;
for(int i=ls+1;i<=rs-1;i++){
int sl=lm[i],sr=rm[i],mid;
if(p[lm[i]]+add[i]>v) continue;
if(p[rm[i]]+add[i]<=v){res+=sl-sr+1;continue;}
while(sl<sr){ mid=((sl+sr)>>1)+1;
if(p[mid]+add[i]<=v) sl=mid;
else sr=mid-1;
} if(p[sl]+add[i]<=v) res+=sl-lm[i]+1;
} return res;}
inline int get_min(int l,int r){
int ls=pos[l],rs=pos[r],res=1e8;
if(ls==rs){ for(int i=l;i<=r;i++) res=min(res,a[i]+add[pos[i]]);
return res;} for(int i=l;i<=rm[ls];i++) res=min(res,a[i]+add[pos[i]]);
for(int i=r;i>=lm[rs];i--) res=min(res,a[i]+add[pos[i]]);
for(int i=ls+1;i<=rs-1;i++) res=min(res,p[lm[i]]+add[pos[i]]);
return res;}
inline int get_max(int l,int r){
int ls=pos[l],rs=pos[r],res=-1e8;
if(ls==rs){ for(int i=l;i<=r;i++) res=max(res,a[i]+add[pos[i]]);
return res;} for(int i=l;i<=rm[ls];i++) res=max(res,a[i]+add[pos[i]]);
for(int i=r;i>=lm[rs];i--) res=max(res,a[i]+add[pos[i]]);
for(int i=ls+1;i<=rs-1;i++) res=max(res,p[rm[i]]+add[pos[i]]);
return res;}
inline int read(){
int x=0,f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x*f;}
inline void modifly(int l,int r,int v){
int ls=pos[l],rs=pos[r];
if(ls==rs){ for(int i=l;i<=r;i++) a[i]+=v;
for(int i=lm[ls];i<=rm[ls];i++) p[i]=a[i];
sort(p+lm[rs],p+rm[rs]+1);return;}
for(int i=l;i<=rm[ls];i++) a[i]+=v;
for(int i=lm[ls];i<=rm[ls];i++) p[i]=a[i];
sort(p+lm[ls],p+rm[ls]+1);
for(int i=r;i>=lm[rs];i--) a[i]+=v;
for(int i=lm[rs];i<=rm[rs];i++) p[i]=a[i];
sort(p+lm[rs],p+rm[rs]+1);
for(int i=ls+1;i<=rs-1;i++) add[i]+=v;
return;}
inline int query(int l,int r,int v){
if(v<1||v>r-l+1) return -1;
int ls=pos[l],rs=pos[r],ans=-1,x=get_min(l,r),y=get_max(l,r),mid;
while(x<=y){ mid=(x+y)>>1;
if(check(l,r,mid)<v) x=mid+1;
else ans=mid,y=mid-1;
} return ans;}
main(){ n=read(),m=read(),key=sqrt(20*n),len=ceil(n*1.0/key);
for(int i=1;i<=n;i++) a[i]=read(),p[i]=a[i],pos[i]=(i-1)/key+1;
for(int i=1;i<=len;i++) lm[i]=(i-1)*key+1,rm[i]=min(i*key,n);
for(int i=1;i<=len;i++) sort(p+lm[i],p+rm[i]+1);
while(m--){ op=read(),x=read(),y=read(),w=read();
if(op==1) cout<<query(x,y,w)<<endl;
else modifly(x,y,w);
} return 0;
}