RT
#include<bits/stdc++.h>
#define int long long
#define begin gsdgfdsa
#define end fgdsgfsakjl
using namespace std;
int n,m,block,begin[1000005],end[1000005];
long long lazy[1000005],a[1000005];
struct node {
int p;
long long num;
bool operator<(const node &a)const {
return a.num>num;
}
} s[1000005],t1[1000005],t2[1000005];
void build() {
block=sqrt(n);
int num=1;
for(int i=1; i<=n; i+=block) {
begin[num]=i,end[num]=min(n,i+block-1);
sort(s+i,s+end[num]+1);
num++;
}
return;
}
inline int query(int k) {
int num=(n/block)+(n%block!=0),ans1=1,ans2=0;
node nk;
nk.num=k;
for(int i=1; i<=num; i++) {
nk.num-=lazy[i];
int p=lower_bound(s+begin[i],s+end[i]+1,nk)-s;
if(s[p].num+lazy[i]==k&&p>=begin[i]&&p<=end[i]) {
for(int j=begin[i]; j<=end[i]; j++) {
if(a[j]+lazy[i]==k) {
ans1=j;
break;
}
}
break;
}
nk.num+=lazy[i];
}
for(int i=num; i>=1; i--) {
nk.num-=lazy[i];
int p=lower_bound(s+begin[i],s+end[i]+1,nk)-s;
if(s[p].num+lazy[i]==k&&p>=begin[i]&&p<=end[i]) {
for(int j=end[i]; j>=begin[i]; j--) {
if(a[j]+lazy[i]==k) {
ans2=j;
break;
}
}
break;
}
nk.num+=lazy[i];
}
return ans2-ans1;
}
void msort(int end1,int end2,int start) {
int cnt1=1,cnt2=1;
for(register int i=start; i<start+end1+end2; i++) {
if((t1[cnt1].num<t2[cnt2].num&&cnt1<=end1)||cnt2>end2)
s[i]=t1[cnt1++];
else s[i]=t2[cnt2++];
}
}
inline void update(int l,int r,int k) {
int numl=(l/block)+(l%block!=0);
int numr=(r/block)+(r%block!=0);
int num1=0,num2=0;
if(numl==numr) {
if(l==begin[numl]&&r==end[numl])lazy[numl]+=k;
else {
for(int i=l; i<=r; i++)a[i]+=k;
for(register int i=begin[numl]; i<=end[numl]; i++) {
a[i]+=lazy[numl];
s[i].num+=lazy[numl];
if(s[i].p>=l&&s[i].p<=r)s[i].num+=k,t1[++num1]=s[i];
else t2[++num2]=s[i];
}
msort(num1,num2,begin[numl]);
lazy[numl]=0;
}
return;
}
for(register int i=l; i<=end[numl]; i++)a[i]+=k;
for(register int i=begin[numr]; i<=r; i++)a[i]+=k;
for(register int i=begin[numl]; i<=end[numl]; i++) {
a[i]+=lazy[numl];
s[i].num+=lazy[numl];
if(s[i].p>=l)s[i].num+=k,t1[++num1]=s[i];
else t2[++num2]=s[i];
}
msort(num1,num2,begin[numl]);
num1=num2=0;
for(register int i=begin[numr]; i<=end[numr]; i++) {
a[i]+=lazy[numr];
s[i].num+=lazy[numr];
if(s[i].p<=r)s[i].num+=k,t1[++num1]=s[i];
else t2[++num2]=s[i];
}
msort(num1,num2,begin[numr]);
lazy[numl]=lazy[numr]=0;
for(int i=numl+1; i<numr; i++)lazy[i]+=k;
}
signed main() {
scanf("%lld%lld",&n,&m);
for(int i=1; i<=n; i++)scanf("%lld",&a[i]),s[i].p=i,s[i].num=a[i];
build();
int opt,x,y,z;
while(m--) {
scanf("%lld%lld",&opt,&x);
if(opt==2)
printf("%lld\n",query(x));
else scanf("%lld%lld",&y,&z),update(x,y,z);
}
}