#include <bits/stdc++.h>
using namespace std;

#define FOR(x,n) for(int x=0;x<n;x++)
#define mp make_pair
#define PI 3.14159265358979323846264338327950288
typedef long long ll;
typedef pair<int,int> ii;

const int MX = 1e5 + 1;
const int CHKSIZE = 150;
const int CHKS = MX/CHKSIZE + 1;

class fenwickTree {
public:
  int* tree;
  int size;

  int get(int index) {
    index++;  // dummy node indexing
    int ret = 0;
    while(index > 0) {
      ret += tree[index];
      index -= (index & -index);
    }
    return ret;
  }

  void update(int index, int delta) {
    if(index >= size) return;
    index++;  // dummy node indexing
    while(index <= size) {
      tree[index] += delta;
      index += (index & -index); 
    }
  }

  int lbound(int x) {
    int curr = 0, currsum = 0;
    for(int i = 20; i >= 0; i--) {
      int bit = (1 << i);
      int up = curr + bit;
      if(up > size || currsum + tree[up] >= x) continue;
      curr = up;
      currsum += tree[up];
    }
    return curr;
  }

  fenwickTree() {
    size = MX;
    tree = new int[size+1];  // +1 for dummy node at 0
    memset(tree, 0, sizeof(int)*(size+1));
    for(int i = 1; i < size; i++) {
      update(i, 1); 
    }
  }
};

int n;
int arr[MX], nxt[2*MX];
fenwickTree tree;
vector<int> updates[CHKS];

void upd1(int i, int val) {
  int idx = i/CHKSIZE;
  int start = idx*CHKSIZE;
  int end = min(idx*CHKSIZE + CHKSIZE, n) - 1;

  arr[i] = val;
  for(int j = start; j <= end; j++) {
    int x = tree.lbound(arr[j]);
    tree.update(x, 1);
    updates[idx][j - start] = x;
  }

  for(int j = end; j >= start; j--) {
    tree.update(updates[idx][j - start], -1);
  }

  sort(updates[idx].begin(), updates[idx].end());
}

int query2(int i) {
  int curr = arr[i];
  i++;
  while(i < n && nxt[i] == -1) {
    if(arr[i] <= curr) curr++;
    i++;
  }

  while(i < n) {
    int idx = i/CHKSIZE;
    curr += upper_bound(updates[idx].begin(), updates[idx].end(), curr) - updates[idx].begin();
    i = nxt[i];
  }

  return n - curr;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  // mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

  memset(nxt, -1, sizeof nxt);
  for(int i = 0; i < 2*MX; i += CHKSIZE) {
    nxt[i] = i + CHKSIZE;
  }
  
  scanf("%d", &n);
  FOR(i,n) {
    scanf("%d", &arr[i]);
  }

  int chks = (n + CHKSIZE - 1)/CHKSIZE;
  FOR(i,chks) {
    updates[i].resize(CHKSIZE, 2*MX);
    upd1(CHKSIZE * i, arr[CHKSIZE * i]);
  }

  int q;
  scanf("%d", &q);
  while(q--) {
    int t;
    scanf("%d", &t);
    if(t == 1) {
      int i, x;
      scanf("%d %d", &i, &x);
      i--;
      upd1(i, x);
    }
    else {
      int i;
      scanf("%d", &i);
      i--;
      printf("%d\n", query2(i));
    }
  }
}

// UPDATE N WHEN UR DONE AAAAAAAAAAAAAAAAAAAAAAAAAAA (if it applies lol)
