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>
#include <algorithm>
#define maxN 100010
#define maxBinN 131072
#define MAX(a,b) ((a>b)?a:b)
#define MIN(a,b) ((a<b)?a:b)
using namespace std;
int it[maxBinN << 1], bin;
int alive[maxBinN << 1];
struct Layer {
    int add, i;
    inline bool operator < (const Layer &c) const {
        return i < c.i;
    }
} wins[maxN << 1];
int renumber(int x, int s, int e, int remain) {
    int m = (s + e) >> 1;
    if( x >= bin ) return m;
    if( alive[x << 1] >= remain ) return renumber(x << 1, s, m, remain);
    return renumber(x << 1 | 1, m + 1, e, remain - alive[x << 1]);
}
int st, ed;
void kill(int x, int s, int e) {
    if( e < st || ed < s ) return;
    else if( st <= s && e <= ed ) alive[x] = 0;
    else {
        int m = (s + e) >> 1;
        kill(x << 1, s, m);
        kill(x << 1 | 1, m + 1, e);
        alive[x] = MIN( alive[x << 1] + alive[x << 1 | 1], alive[x] );
    }
}
int getMax(int x, int s, int e) {
    if( e < st || ed < s ) return -1;
    else if( st <= s && e <= ed ) return it[x];
    else {
        int m = (s + e) >> 1, t, tt;
        t = getMax(x << 1, s, m);
        tt = getMax(x << 1 | 1, m + 1, e);
        return MAX(t, tt);
    }
}
int GetBestPosition(int n, int rn, int my, int *a, int *S, int *E) {
    bin = 1;
    while( n > bin ) bin <<= 1;
    for(int i = 0; i < n - 1; i++) it[bin + i] = a[i];
    for(int i = 0; i < n; i++) alive[bin + i] = 1;
    for(int i = bin - 1; i; i--) {
        it[i] = MAX(it[i << 1], it[i << 1 | 1]);
        alive[i] = alive[i << 1] + alive[i << 1 | 1];
    }
    int m = 0;
    for(int r = 0; r < rn; r++) {
        S[r] = renumber(1, 0, bin - 1, S[r] + 1);
        E[r] = renumber(1, 0, bin - 1, E[r] + 1);
        st = S[r] + 1, ed = E[r];
        kill(1, 0, bin - 1);
        st = S[r], ed = E[r] - 1;
        if( my > getMax(1, 0, bin - 1)) {
//            printf("%d %d %d\n", S[r] + 1, E[r] + 1, getMax(1, 0, bin - 1) + 1);
            wins[m].i = S[r], wins[m++].add = 1;
            wins[m].i = E[r], wins[m++].add = -1;
        }
    }
    int acc = 0, best = 0, ans = 0;
    sort(wins, wins + m);
    for(int i = 0; i < m; i++) {
        acc += wins[i].add;
//        printf("%d %d\n", wins[i].i + 1, wins[i].add);
        if( acc > best ) best = acc, ans = wins[i].i;
    }
    return ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |