#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9,SqrtN = 359,INF = 2e9 + 2e4 + 9;
inline char gc(){
static char buf[10000005],*t1 = buf,*t2 = buf;
return t1 == t2 && (t2 = (t1 = buf) + fread(buf,1,1000000,stdin),t1 == t2) ? EOF : *t1++;
}
int read(){
char c = gc();
int x = 0,f = 1;
while(c < '0' || c > '9'){
if (c == '-')
f = -1;
c = gc();
}
while(c >= '0' && c <= '9'){
x = (x << 3) + (x << 1) + c - 48;
c = gc();
}
return x * f;
}
int n,q;
int a[N],tmp[N];
struct block{
int l,r,add;
} b[SqrtN];
int belong[N];
int block_cnt,block_len;
void block_sort1(int block_id){
int l = b[block_id].l,r = b[block_id].r;
for(int i = l;i <= r;i++)
tmp[i] = a[i];
sort(tmp + l,tmp + r + 1);
}
void block_sort2(int block_id,int pos){
int i = b[block_id].l,j = pos + 1;
for(int k = b[block_id].l;k <= b[block_id].r;k++){
if(j > b[block_id].r || i <= pos && a[i] < a[j])
tmp[k] = a[i++];
else
tmp[k] = a[j++];
}
}
void build_block(){
block_cnt = block_len = sqrt(n);
for(int i = 1;i <= block_cnt;i++){
b[i].l = b[i - 1].r + 1;
b[i].r = b[i].l + block_len - 1;
}
b[block_cnt].r = n;
for(int i = 1;i <= block_cnt;i++){
block_sort1(i);
for(int j = b[i].l;j <= b[i].r;j++)
belong[j] = i;
}
}
void update(int l,int r,int k){
int pos_l = belong[l],pos_r = belong[r];
if(pos_l == pos_r){
for(int i = l;i <= r;i++)
a[i] += k;
block_sort1(pos_r);
return;
}
for(int i = l;i <= b[pos_l].r;i++)
a[i] += k;
for(int i = b[pos_r].l;i <= r;i++)
a[i] += k;
for(int i = pos_l + 1;i <= pos_r - 1;i++)
b[i].add += k;
block_sort2(pos_r,r);
}
int query(int l,int r,int k){
int ret = 0;
int pos_l = belong[l],pos_r = belong[r];
if(pos_l == pos_r){
for(int i = l;i <= r;i++)
if(a[i] + b[pos_l].add <= k)
ret++;
return ret;
}
for(int i = l;i <= b[pos_l].r;i++)
if(a[i] + b[pos_l].add <= k)
ret++;
for(int i = b[pos_r].l;i <= r;i++)
if(a[i] + b[pos_r].add <= k)
ret++;
for(int i = pos_l + 1;i <= pos_r - 1;i++){
int L = b[i].l,R = b[i].r;
while(L < R){
int mid = (L + R + 1) >> 1;
if(tmp[mid] + b[i].add <= k)
L = mid;
else
R = mid - 1;
}
ret += L - b[i].l + 1;
}
return ret;
}
int query_min(int l,int r){
int ret = INF;
int pos_l = belong[l],pos_r = belong[r];
if(pos_l == pos_r){
for(int i = l;i <= r;i++)
ret = min(ret,a[i] + b[pos_l].add);
return ret;
}
for(int i = l;i <= b[pos_l].r;i++)
ret = min(ret,a[i] + b[pos_l].add);
for(int i = b[pos_r].l;i <= r;i++)
ret = min(ret,a[i] + b[pos_l].add);
for(int i = pos_l + 1;i <= pos_r - 1;i++)
ret = min(ret,tmp[b[i].l] + b[pos_l].add);
return ret;
}
int query_max(int l,int r){
int ret = -INF;
int pos_l = belong[l],pos_r = belong[r];
if(pos_l == pos_r){
for(int i = l;i <= r;i++)
ret = max(ret,a[i] + b[pos_l].add);
return ret;
}
for(int i = l;i <= b[pos_l].r;i++)
ret = max(ret,a[i] + b[pos_l].add);
for(int i = b[pos_r].l;i <= r;i++)
ret = max(ret,a[i] + b[pos_l].add);
for(int i = pos_l + 1;i <= pos_r - 1;i++)
ret = max(ret,tmp[b[i].r] + b[pos_l].add);
return ret;
}
int main(){
ios::sync_with_stdio(false);
cout.tie(0);
n = read();q = read();
for(int i = 1;i <= n;i++)
a[i] = read();
build_block();
for(int i = 1;i <= q;i++){
int op = read();
int l = read(),r = read(),k = read();
if(op == 2)
update(l,r,k);
else{
int L = query_min(l,r),R = query_max(l,r),ans = -1;
while(L <= R){
int mid = (L + R) >> 1;
if(query(l,r,mid) >= k){
ans = mid;
R = mid - 1;
}
else
L = mid + 1;
}
cout << ans << '\n';
}
}
return 0;
}