This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 250005, Nr = 1e6;
typedef long long ll;
int n, start, x, y, i, Q, End;
int where[Nmax], prv[Nmax], nxt[Nmax];
char tip;
int Cnt[Nmax], A[Nmax];
class AIB
{
    int a[Nmax];
    int n, lg;
    inline int ub(int x) { return (x&(-x)); }
    public:
        void init(int _n)
        {
            n = _n;
            for(lg = 0; (1<<lg) <= n; ++lg); --lg;
        }
        int queryMax(int pos)
        {
            int ans = 0;
            for(; pos; pos-=ub(pos)) ans = max(ans, a[pos]);
            return ans;
        }
        int querySmaller(int val)
        {
            int pos = 0, i;
            for(i=lg; i>=0; --i)
                if(pos + (1<<i) <= n && a[pos + (1<<i)] < val) pos += (1<<i);
            return pos;
        }
        void update(int pos, int val)
        {
            for(; pos<=n; pos+=ub(pos)) a[pos] = max(a[pos], val);
        }
} aib[2];
int Query(int pos)
{
    if(pos == start) return 0;
    bool ok = (pos > start);
    pos = (ok ? pos - start : start - pos);
    return pos + aib[ok^1].querySmaller(aib[ok].queryMax(pos));
}
void upd(int pos, int val)
{
    if(pos == start) return;
    bool ok = (pos > start);
    pos = (ok ? pos - start : start - pos);
    aib[ok].update(pos, val);
}
void Update(int pos, int gust)
{
    prv[nxt[pos]] = prv[pos]; /// deletee
    nxt[prv[pos]] = nxt[pos];
    if(gust == 1)
    {
        nxt[End] = pos;
        prv[pos] = End;
        End = pos;
        A[pos] = A[prv[pos]] + 1;
        upd(pos, A[pos]);
        return;
    }
    int i, p = End;
    for(i=1; i<gust; ++i) /// increasee
    {
        A[p] ++;
        upd(p, A[p]);
        p = prv[p];
    }
    int p2 = nxt[p];
    prv[p2] = pos;
    nxt[p] = pos;
    prv[pos] = p;
    nxt[pos] = p2;
    A[pos] = A[prv[pos]] + 1;
    upd(pos, A[pos]);
}
int main()
{
 //   freopen("input", "r", stdin);
 //   freopen("output", "w", stdout);
    cin.sync_with_stdio(false);
    cin >> n >> start;
    aib[0].init(start-1);
    aib[1].init(n-start);
    for(i=1; i<=n; ++i)
    {
        cin >> A[i];
        where[A[i]] = i;
        if(i < start) aib[0].update(start - i, A[i]);
            else if(i > start) aib[1].update(i - start, A[i]);
    }
    for(i=1; i<=n; ++i)
        prv[i] = where[A[i]-1], nxt[i] = where[A[i]+1];
    End = where[n];
    cin >> Q;
    while(Q--)
    {
        cin >> tip >> x;
        if(tip == 'F')
        {
            cout << Query(x) << '\n';
            continue;
        }
        cin >> y;
        Update(x, y);
    }
    return 0;
}
Compilation message (stderr)
cake.cpp: In member function 'void AIB::init(int)':
cake.cpp:23:13: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
             for(lg = 0; (1<<lg) <= n; ++lg); --lg;
             ^~~
cake.cpp:23:46: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
             for(lg = 0; (1<<lg) <= n; ++lg); --lg;
                                              ^~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |