#include <bits/stdc++.h>
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define ll long long
using namespace std;
const ll N=1e6+5;
ll a[N],t[4*N],y,z,x,n,q,mx,mn,k,ans,ind;
bool ok,okk;
string s,s1;
void update(int idx,int tl,int tr,int ind,int val){
if (tr-tl==1){
t[idx]+=val; return ;
}
int tm=(tl+tr)/2;
if (ind<tm) update(idx*2,tl,tm,ind,val); else update(idx*2+1,tm,tr,ind,val);
t[idx]=t[idx*2]+t[idx*2+1];
}
ll query(int idx,int tl,int tr,int l,int r){
if (tl>=r || tr<=l) return 0;
if (l<=tl && tr<=r) return t[idx];
int tm=(tl+tr)/2;
return query(idx*2,tl,tm,l,r)+query(idx*2+1,tm,tr,l,r);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> q;
for (int i=1; i<=n; i++) {
cin >> a[i];
}int H=1e6;
for (int i=2; i<=n; i++){
x=min(a[i],a[i-1])+1; y=max(a[i-1],a[i]);
if (x>=y) continue;
update(1,1,H+1,x,1);
update(1,1,H+1,y,-1);
}
while (q--){
cin>>z;
if (z==1){
cin >> x >> y;
if (x>1){
int mn=min(a[x],a[x-1])+1; int mx=max(a[x],a[x-1]);
if (mn<mx) {
update(1,1,H+1,mn,-1);
update(1,1,H+1,mx,1);
}
}
if (x<n){
int mn=min(a[x],a[x+1])+1; int mx=max(a[x],a[x+1]);
if (mn<mx) {
update(1,1,H+1,mn,-1);
update(1,1,H+1,mx,1);
}
}
a[x]=y;
if (x>1){
int mn=min(a[x],a[x-1])+1; int mx=max(a[x],a[x-1]);
if (mn<mx) {
update(1,1,H+1,mn,1);
update(1,1,H+1,mx,-1);
}
}
if (x<n){
int mn=min(a[x],a[x+1])+1; int mx=max(a[x],a[x+1]);
if (mn<mx) {
update(1,1,H+1,mn,1);
update(1,1,H+1,mx,-1);
}
}
}
else{
cin >> x;
cout<<query(1,1,H+1,1,x+1)<<endl;
}
}
}