#include<cstdio>
#include<cmath>
#include<algorithm>
#define lol long long
using namespace std;
int read(){
int p=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') p=(p<<1)+(p<<3)+ch-'0',ch=getchar();
return p;
}
const int N=1e5+5;
int n,id[N],m,ll[320],rr[320],len;
lol a[N],tag[320],b[N];
void add(int l,int r,lol v){
if(id[l]==id[r]){
for(int i=l;i<=r;i++) a[i]+=v;
for(int i=ll[id[l]];i<=rr[id[l]];i++) b[i]=a[i];
sort(b+ll[id[l]],b+rr[id[l]]+1);
}
else{
for(int i=l;i<=rr[id[l]];i++) a[i]+=v;
for(int i=ll[id[r]];i<=r;i++) a[i]+=v;
for(int i=ll[id[l]];i<=rr[id[l]];i++) b[i]=a[i];
for(int i=ll[id[r]];i<=rr[id[r]];i++) b[i]=a[i];
sort(b+ll[id[l]],b+rr[id[l]]+1);
sort(b+ll[id[r]],b+rr[id[r]]+1);
for(int i=id[l]+1;i<id[r];i++) tag[i]+=v;
}
}
lol get_max(int l,int r){
lol mx=-1e18;
if(id[l]==id[r]){
for(int i=l;i<=r;i++) mx=max(mx,a[i]+tag[id[l]]);
}
else{
for(int i=l;i<=rr[id[l]];i++) mx=max(mx,a[i]+tag[id[i]]);
for(int i=ll[id[r]];i<=r;i++) mx=max(mx,a[i]+tag[id[i]]);
for(int i=id[l]+1;i<id[r];i++) mx=max(mx,b[rr[i]]+tag[i]);
}
return mx;
}
lol get_min(int l,int r){
lol mi=1e18;
if(id[l]==id[r]){
for(int i=l;i<=r;i++) mi=min(mi,a[i]+tag[id[l]]);
}
else{
for(int i=l;i<=rr[id[l]];i++) mi=min(mi,a[i]+tag[id[i]]);
for(int i=ll[id[r]];i<=r;i++) mi=min(mi,a[i]+tag[id[i]]);
for(int i=id[l]+1;i<id[r];i++) mi=min(mi,b[ll[i]]+tag[i]);
}
return mi;
}
int solve(int x,lol v){
if(v>=b[rr[x]]+tag[x]) return rr[x]-ll[x]+1;
if(v<b[ll[x]]+tag[x]) return 0;
int l=1,r=rr[x]-ll[x]+1,ans=0;
while(l<=r){
int mid=l+r>>1;
if(b[mid+ll[x]-1]+tag[x]<=v) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int get(int l,int r,lol v){
int cnt=0;
if(id[l]==id[r]){
for(int i=l;i<=r;i++) if(a[i]+tag[id[i]]<=v) cnt++;
}
else{
for(int i=l;i<=rr[id[l]];i++) if(a[i]+tag[id[i]]<=v) cnt++;
for(int i=ll[id[r]];i<=r;i++) if(a[i]+tag[id[i]]<=v) cnt++;
for(int i=id[l]+1;i<id[r];i++) cnt+=solve(i,v);
}
return cnt;
}
lol query(int o,int p,int v){
if(v<1||p-o+1<v) return -1;
if(v==1) return get_min(o,p);
if(v==p-o+1) return get_max(o,p);
lol l=get_min(o,p);
lol r=get_max(o,p);
lol ans=-1;
while(l<=r){
lol mid=(l+r)/2;
if(get(o,p,mid)>=v) ans=mid,r=mid-1;
else l=mid+1;
}
return ans;
}
int main(){
n=read(),m=read();
len=sqrt(n);
for(int i=1;i<=n;i++){
a[i]=read();
b[i]=a[i];
id[i]=i%len==0?i/len:i/len+1;
if(i%len==0) rr[id[i]]=i;
if(i%len==1) ll[id[i]]=i;
}
rr[id[n]]=n;
if(len==1){
for(int i=1;i<=id[n];i++) ll[i]=rr[i]=i;
}
for(int i=1;i<=id[n];i++) sort(b+ll[i],b+rr[i]+1);
while(m--){
lol op=read(),l=read(),r=read(),k=read();
if(op==1) printf("%lld\n",query(l,r,k));
else add(l,r,k);
}
return 0;
}