func_code_string: #include <cstdio>   #include <algorithm>   #include <vector>   #include <set>   #include <cstdlib>   #include <utility>   #include <cmath>   #include <queue>   #include <stack>   #include <cstring>      using namespace std;      #define ll long long      #ifndef ONLINE_JUDGE   #define debug(format, ...) fprintf(stderr,         %s:%d:   format   n , __func__, __LINE__,##__VA_ARGS__)   #else   #define debug(format, ...)   #define NDEBUG   #endif      #define BLKSIZE 300      int n, q;   int b[100005];   int blkid[100005];   int blkbegin[100005];   // for block i, minimum start value required for j increases   int mincnt[400][405];   int f[100005];      int fen[300005];      #define lowbit(x) ((x)&(-(x)))      int rquery(int* arr, int v)   {       int ans = 0;       while (v) {           ans += arr[v]; v -= lowbit(v);       }       return ans;   }      void modify(int* arr, int loc, int val)   {       //printf( %d %lld n , loc, val);       while (loc <= n) {           arr[loc] += val; loc += lowbit(loc);       }   }      void updateblock(int id)   {       int start = max(id * BLKSIZE, 1);       for (int i = start; blkid[i] == id; i++) {           int x = 0; int curv = 0;           for (int j = 16; j >= 0; j--) {               int nx = x + (1 << j);               if (nx <= n && curv + fen[nx] + nx <= b[i]) {                   x = nx; curv += fen[nx];               }           }           f[i] = x + 1; if (f[i] <= n) modify(fen, f[i], 1);       }       vector<int> vals;       for (int i = start; blkid[i] == id; i++) {           vals.push_back(f[i]);           if (f[i] <= n) modify(fen, f[i], -1);       }       sort(vals.begin(), vals.end());       for (int i = 0; i < vals.size(); i++) {           mincnt[id][i+1] = vals[i];       }       for (int i = vals.size() + 1; i <= BLKSIZE; i++) {           mincnt[id][i] = 10000000;       }   }      int main()   {       scanf( %d , &n);       for (int i = 1; i <= n; i++) scanf( %d , b + i);       blkid[0] = blkid[n + 1] = -1;       for (int i = 1; i <= n; i++) {           blkid[i] = i / BLKSIZE;           blkbegin[i] = (blkid[i-1] == blkid[i] ? blkbegin[i-1] : i);       }       for (int i = 0; i <= n / BLKSIZE; i++) {           updateblock(i);       }       scanf( %d , &q);       for (int qr = 1; qr <= q; qr++) {           int typ; scanf( %d , &typ);           if (typ == 1) {               int x, y; scanf( %d%d , &x, &y);               b[x] = y; updateblock(blkid[x]);           } else {               int x; scanf( %d , &x);               int cur = b[x] + 1; int i;               for (i = x + 1; blkid[i] == blkid[x]; i++) {                   if (cur > b[i]) cur++;               }               if (i <= n) {                   for (int j = blkid[i]; j <= n / BLKSIZE; j++) {                       int l = 0; int r = BLKSIZE;                       while (l < r) {                           int mid = (l + r) / 2 + 1;                           if (cur >= mincnt[j][mid]) {                               l = mid;                           } else {                               r = mid - 1;                           }                       }                       cur += l;                   }               }               printf( %d n , n + 1 - cur);           }       }       return 0;   }   