이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
using namespace std;
 
#define           f     first
#define           s     second
#define           pb    push_back
#define           ep    emplace
#define           eb    emplace_back
#define           lb    lower_bound
#define           ub    upper_bound
#define       all(x)    x.begin(), x.end()
#define      rall(x)    x.rbegin(), x.rend()
#define   uniquev(v)    sort(all(v)), (v).resize(unique(all(v)) - (v).begin())
#define     mem(f,x)    memset(f , x , sizeof(f))
#define        sz(x)    (int)(x).size()
#define  __lcm(a, b)    (1ll * ((a) / __gcd((a), (b))) * (b))
#define          mxx    *max_element
#define          mnn    *min_element
#define    cntbit(x)    __builtin_popcountll(x)
#define       len(x)    (int)(x.length())
 
const int N = 1e5 + 10;
struct fen{
    vector <ll> f;
    int N;
    void ass(int n) {
        N = n + 100;
        f.assign(N + 1, 0);
    }
    void upd(int i, ll x) {
        for (;i <= N; i += i & (-i))
            f[i] += x;
    }
    ll get(int i) {
        ll s = 0;
        for (; i; i -= i & (-i))
            s += f[i];
        return s;
    }
};
struct seg{
    vector <int> seg, laz;
    void ass(int n) {
        seg.assign(n * 4 + 10, 1);
        laz.assign(n * 4 + 10, -1);
    }
    void build(int id, int l, int r) {
        if (l == r) {
            seg[id] = 1;
            return;
        }
        int m = (l + r) / 2;
        build(id * 2, l, m);
        build(id * 2 + 1, m + 1, r);
        seg[id] = seg[id * 2] + seg[id * 2 + 1];
    }
    void push(int id) {
        int t = laz[id];
        if (t == 0) {
            laz[id * 2] = laz[id * 2 + 1] = seg[id * 2] = seg[id * 2 + 1] = 0;
        }
        laz[id] = -1;
    }
    void upd(int id, int l, int r, int u, int v) {
        if (l > v || r < u)
            return;
        if (l >= u && r <= v) {
            seg[id] = 0;
            laz[id] = 0;
            return;
        }
        push(id);
        int m = (l + r) / 2;
        upd(id * 2, l, m, u, v);
        upd(id * 2 + 1, m + 1, r, u, v);
        seg[id] = seg[id * 2] + seg[id * 2 + 1];
    }
    int find(int id, int l, int r, int k) {
        if (seg[id] < k)
            return r + 1;
        if (l == r)
            return l;
        if (k == 0)
            return l;
        int m = (l + r) / 2;
        push(id);
        if (seg[id * 2] < k)
            return find(id * 2 + 1, m + 1, r, k - seg[id * 2]);
        return find(id * 2, l, m, k);
    }
};
int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {    
    int n = N;
    int c = C;
    int r = R;
    set <int> pos, used;
    for (int i = 1; i < n; i++) {
        if (K[i - 1] > r) {
            pos.insert(i);
        } 
        used.insert(i);
    }
    pos.insert(n + 100);
    used.insert(n);
    seg st;
    st.ass(n);
    st.build(1, 1, n);
    fen F;
    F.ass(n + 1);
    int ans = 0, p = 0;
    for (int i = 0; i < c; i++) {
        S[i]++;
        E[i]++;
        S[i] = st.find(1, 1, n, S[i]);
        E[i] = st.find(1, 1, n, E[i] + 1) - 1;
        st.upd(1, 1, n, S[i], E[i] - 1);
        if (*pos.lower_bound(S[i]) < E[i]) {
            auto it = used.lower_bound(S[i]);
            vector <int> del;
            while (it != used.end() && *it <= E[i]) {
                del.pb(*it);
                it = next(it);
            }
            for (auto x : del) {
                int t = F.get(x);
                if (ans < t) {
                    ans = t;
                    p = x - 1;
                }
                used.erase(x);
            }
        }
        F.upd(S[i], 1);
        F.upd(E[i] + 1, -1);
    }
    for (auto x : used) {
        int t = F.get(x);
        if (ans < t) {
            ans = t;
            p = x - 1; 
        }
    }
    return p;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |