#include<bits/stdc++.h>
#define fi first
#define se second


#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define pb push_back
#define len(x) (int)(x).size()
typedef long long ll;
typedef long double ld;
using namespace std;
const bool debug = 0;
const int N = (int)1e5 + 10;
const int inf = 1e9;
const int buben = 400;
mt19937 rng(199999973);

vector < pair<int,int> > indablock[N/buben+1];
int perm[N], n;


pair<int,int> memory[4*buben][buben];
int PNT[4*buben];

void OG(int v, vector<int>&perm, int l , int r){
    if(l == r){
        PNT[v]=0;
        memory[v][PNT[v]++] = {0,0};
        memory[v][PNT[v]++] = {perm[l] , 1};
        memory[v][PNT[v]++] = {N, 0};
        return;
    }
    int mid = (l + r) >> 1;
    OG(v*2+1, perm, l , mid);
    OG(v*2, perm, mid+1 , r);
    PNT[v]=0;
    int lst = 0;
    int LST = 0;
    for(int x = 0;  x < PNT[2*v+1] - 1; ++x){
        /// cur is

        int L = memory[2*v+1][x].fi + memory[2*v+1][x].se;
        int R = min(N-5,memory[2*v+1][x+1].fi-1 + memory[2*v+1][x].se);

        while(lst+1 < PNT[2*v] && memory[2*v][lst+1].fi <= L)
            ++lst;
        if(lst == PNT[2*v]-1){
            memory[v][PNT[v]++]= {memory[2*v+1][x].fi , memory[2*v+1][x].se};
        }else{
            while(lst < PNT[2*v]-1){
                assert(memory[2*v][lst].fi <= L);
                int r = min(R , memory[2*v][lst+1].fi-1);
                /// so for them
                memory[v][PNT[v]++] = {L-memory[2*v+1][x].se, memory[2*v+1][x].se+memory[2*v][lst].se};
                L = r + 1;
                if(r == R)
                    break;
                lst++;
            }
        }
    }
//    assert(len(C) <= 2*buben);
    memory[v][PNT[v]++] = {N, 0};
}
void additupbankroll(int id , vector<int>perm){
    OG(1, perm, 0 , len(perm)-1);
    indablock[id].clear();
    for(int x = 0 ; x < PNT[1]; ++x)
        indablock[id].pb(memory[1][x]);
}

int pass_through(int id, int x){
    int ind = lower_bound(all(indablock[id]), make_pair(x+1,-1)) - indablock[id].begin();
    ind--;
    return indablock[id][ind].se;
}

void flexindablock(int id){
    /// so
    int L = id * buben, R = min(n-1, (id+1)*buben-1);
    vector<int>cur;
    for(int x = L;x <= R; ++x){
        cur.pb(x+1-perm[x]);
    }
    additupbankroll(id , cur);
}

signed main(){
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    if(debug)
        n = 1e5;
    else
    cin >> n;
    for(int i = 0 ; i < n; ++i){
        if(debug)
            perm[i] = rng()%(i+1);
        else
            cin >> perm[i];
    }
    int q;
    if(debug)
        q = 1e5;
    else
        cin >> q;
    /// so the id is
    for(int i =0 ; i <= (n-1)/buben; ++i){
        flexindablock(i);
    }
    int done = 0;
    while(q--){
//        cerr << done << '\n';
        int t;
        if(debug){
            t = rng() % 2 + 1;
        }else
            cin >> t;
        if(t == 1){
            int i , x;
            if(debug){
                i = rng() % n;
                i++;
                x = rng() % i;
            }else
                cin >> i >> x;
//            assert(i >= 1 && i <= n);
//            assert(x >= 0 && x < i);
            --i;
            perm[i] = x;
            flexindablock(i / buben);
        }else{
            int i;
            if(debug)
                i = rng() % n + 1;
            else
                cin >> i;
//            assert(i >= 1 && i <= n);
            --i;
            /// so firstly our pos is
            int x = i + 1 - perm[i];
            i++;
            while(i < n){
                if(i % buben == 0 && i + buben - 1 < n){
                    x += pass_through(i / buben , x);
                    i += buben;
                    continue;
                }
                int cur = i + 1 - perm[i];
                if(x >= cur)
                    x++;
                i++;
            }
            cout <<  x << '\n';
        }
//        done++;
    }
    return 0;
}
