#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1000010;
ll n,num,sq;
ll a[N],b[N],tag[N],q[N],lll[N],rrr[N];
void order(int x)
{
for(int i=lll[q[x]];i<=rrr[q[x]];i++) b[i]=a[i];
sort(b+lll[q[x]],b+rrr[q[x]]+1);
}
void build()
{
sq=sqrt(n);
num=(ll)ceil(n*1.0/sq);
for(int i=1;i<=n;i++)
{
q[i]=(i-1)/sq+1;
b[i]=a[i];
}
for(int i=1;i<=num;i++)
{
lll[i]=(i-1)*sq+1;
rrr[i]=i*sq;
}
rrr[num]=n;
for(int i=1;i<=num;i++) sort(b+lll[i],b+rrr[i]+1);
}
void change(int l,int r,int c)
{
if(q[l]==q[r])
{
for(int i=l;i<=r;i++) a[i]+=c;
order(l);
return;
}
for(int i=l;i<=rrr[q[l]];i++) a[i]+=c;
for(int i=lll[q[r]];i<=r;i++) a[i]+=c;
order(l),order(r);
for(int i=q[l]+1;i<q[r];i++) tag[i]+=c;
}
ll ask(int l,int r,ll c)
{
ll ans=-1e10,flag=0;
if(q[l]==q[r])
{
for(int i=l;i<=r;i++)
{
if(a[i]+tag[q[i]]<c)
{
ans=max(ans,a[i]+tag[q[i]]);
flag=1;
}
}
if(flag) return ans;
else return -1;
}
for(int i=l;i<=rrr[q[l]];i++)
{
if(a[i]+tag[q[i]]<c)
{
ans=max(ans,a[i]+tag[q[i]]);
flag=1;
}
}
for(int i=lll[q[r]];i<=r;i++)
{
if(a[i]+tag[q[i]]<c)
{
ans=max(ans,a[i]+tag[q[i]]);
flag=1;
}
}
for(int i=q[l]+1;i<q[r];i++)
{
ll pos=lower_bound(b+lll[i],b+rrr[i]+1,c-tag[i])-b-1;
if(pos<lll[i]) continue;
ans=max(ans,b[pos]+tag[i]);
flag=1;
}
if(flag) return ans;
else return -1;
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build();
for(int i=1;i<=n;i++)
{
ll op,l,r,c;
scanf("%lld%lld%lld%lld",&op,&l,&r,&c);
if(op==0) change(l,r,c);
else printf("%lld\n",ask(l,r,c));
}
return 0;
}
/*
4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4
*/
双倍经验:洛谷 守墓人