#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
 
using namespace std;
 
const int MAXN = 1e5 + 5;
 
struct item{
  int x, pos;
} A[MAXN];
 
int bit[MAXN], idx[MAXN], revidx[MAXN], N, Q, j, k;      
 
void add(int pos, int v){ for(; pos<=N; pos+=(pos & -pos)) bit[pos] += v; }
 
int query(int pos){
  int res = 0;
  for(; pos>0; pos-=(pos & -pos)) res += bit[pos];
  return res;
}
 
int LO(int x){
  int lo = 0, hi = N, mid, cur;
  if(query(N) < x) return N + 1;
  while(lo < hi - 1) {
    mid = (lo + hi)>>1;
    cur = query(mid);
    if(cur >= x) hi = mid;
    else lo = mid;
  }
  return hi;
}
 
int comp(item a, item b) {
  return a.x < b.x;
}
 
int main(){
  scanf("%d %d", &N, &Q);
  for(int i=1; i<=N; ++i){
    scanf("%d", &A[i].x);
    A[i].pos = i;
  }
  sort(A + 1, A + N + 1, comp);
  for(int i=1; i<=N; ++i){
    idx[A[i].pos] = i, revidx[i] = A[i].pos;
    add(i, A[i].x - A[i-1].x);
  } 
  while(Q--){
    scanf("%d %d", &k, &j);
    if(k == 1){
      int prev = j, cur, p;
      j = idx[j];
      cur = LO(query(j) + 1) - 1;
      add(cur, 1); add(cur + 1, -1);
      p = revidx[cur], idx[prev] = cur, revidx[cur] = prev;
      idx[p] = j, revidx[j] = p;
    }
    else if(k == 2) printf("%d\n", N - LO(j) + 1);
    else add(LO(j), -1);
  }
  return 0;
}