답안 #285994

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
285994 2020-08-29T21:22:42 Z caoash 케이크 (CEOI14_cake) C++14
0 / 100
207 ms 8824 KB
#pragma GCC target ("avx,avx2")
#pragma GCC optimize ("Ofast")

#include <bits/stdc++.h> 
using namespace std;

using ll = long long;

using vi = vector<int>;
#define pb push_back
#define rsz resize
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()

using pi = pair<int,int>;
#define f first
#define s second
#define mp make_pair

template<class T, int SZ> struct Seg{
    T tree[4*SZ];
    T merge(T a, T b){
        return max(a, b);
    }
    
    void update(int v, int l, int r, int i, T x) {
        if (i > r || i < l) {
            return;
        } else if (l == r) {
            tree[v] = x;
        } else {
            int m = (l + r) / 2;
            update(2 * v + 1, l, m, i, x);
            update(2 * v + 2, m + 1, r, i, x);
            tree[v] = merge(tree[2 * v + 1], tree[2 * v + 2]);
        }
    }

    T query2(int v, int l, int r, int ql, int qr) {
        if (ql > r || qr < l) {
            return 0;
        }
        if (l >= ql && r <= qr) {
            return tree[v];
        }
        else {
            int m = (l + r) / 2;
            T a = query2(2 * v + 1, l, m, ql, qr);
            T b = query2(2 * v + 2, m + 1, r, ql, qr);
            return merge(a, b);
        }
    }

    T query(int v, int l, int r, int val, int dir) {
        if (r < l || tree[v] <= val) {
            return -1;
        }
        else if(l == r) {
            // cout << "DONE: " << l << "\n";
            return l;
        }
        else {
            int m = (l + r) / 2;
            // cout << "v, l, r, dir: " << tree[2 * v + 1] << " " << v << " " << l << " " << r << '\n';
            if (dir) {
                if (tree[2 * v + 2] > val) { 
                    return query(2 * v + 2, m + 1, r, val, dir);
                }
                else {
                    return query(2 * v + 1, l, m, val, dir);
                }
            }
            else {
                if (tree[2 * v + 1] > val) {
                    return query(2 * v + 1, l, m, val, dir); 
                }
                else {
                    return query(2 * v + 2, m + 1, r, val, dir);
                }
            }
        }
    }
};

const int MX = 250005;

int pos[MX];

Seg<int, MX> lft, rgt; 

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, a; cin >> n >> a;
    a--;
    vi d(n);
    for (int i = 0; i < n; i++) {
        cin >> d[i]; 
        pos[d[i]] = i;
        if(i < a) lft.update(0, 0, n - 1, i, d[i]);
        else if (i > a) rgt.update(0, 0, n - 1, i, d[i]);
    }
    /*
    cout << "vals: " << '\n';
    for (int i = 0; i < n; i++) {
        cout << vals.query(0, 0, n - 1, i, i) << " ";
    }
    cout << '\n';
    */ 
    int q; cin >> q;
    vector<pi> top;
    for (int i = max(1, n - 9); i <= n; i++) {
        top.pb(mp(i, pos[i]));
    }
    vector<pi> order;
    while(q--) {
        char qt; cin >> qt; 
        if (qt == 'E') {
            int i, e; cin >> i >> e;
            i--;
            /* 
            cout << "TOP: " << '\n';
            for (int x : top) {
                cout << x << " ";
            }
            cout << '\n';
            */
            assert(sz(top) <= 10);
            for (int j = 0; j < e - 1; j++) {
                if (top.back().s != i) {
                    int v = top.back().f; int p = top.back().s;
                    order.pb(mp(v + 1, p));
                    if(p < a) lft.update(0, 0, n - 1, p, v + 1);
                    else if(p > a) rgt.update(0, 0, n - 1, p, v + 1);
                    d[p] = v + 1;
                }
                else {
                    j--;
                }
                top.pop_back();
            }
            int prev = d[i];
            // cout << "prev: " << prev << endl;
            d[i] = top.back().f + 1;
            if(i < a) lft.update(0, 0, n - 1, i, top.back().f + 1);
            else if(i > a) rgt.update(0, 0, n - 1, i, top.back().f + 1);
            order.pb(mp(top.back().f + 1, i));
            while (!top.empty()) {
                if(top.back().f != prev) order.pb(mp(top.back().f, top.back().s));
                top.pop_back(); 
            }
            reverse(all(order));
            for (pi x : order) {
                top.pb(x);
            }
            order.clear();
        }
        else {
            // cout << "vals: " << '\n';
            /*
            for (int j = 0; j < n; j++) {
                if (j < a) {
                    cout << lft.query2(0, 0, n - 1, j, j) << " ";
                }
                else if (j == a) {
                    cout << -1 << " ";
                }
                else {
                    cout << rgt.query2(0, 0, n - 1, j, j) << " ";
                }
            }
            */
            // cout << '\n';
            int x; cin >> x;
            x--;
            if (x == a) { 
                cout << 0 << '\n';
                continue;
            }
            int best = 0;
            if (x < a) best = lft.query2(0, 0, n - 1, x, a - 1);
            else if (x > a) best = rgt.query2(0, 0, n - 1, a + 1, x);
            // cout << "x, a, best: " << x << " " << a << " " << best << '\n';
            if (x < a) {
                int ans = rgt.query(0, 0, n - 1, best, 0);
                if (rgt.query2(0, 0, n - 1, a + 1, n - 1) <= best) {
                    ans = n;
                }
                // cout << "ans: " << ans << '\n';
                cout << (ans - x - 1) << '\n';
            }
            else if(x > a) {
                int ans = lft.query(0, 0, n - 1, best, 1);
                if (lft.query2(0, 0, n - 1, 0, a - 1) <= best) {
                    ans = -1;
                }
                // cout << "ans: " << ans << '\n';
                cout << (x - ans - 1) << '\n';
            }
        }
    }
}

# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Runtime error 1 ms 512 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 4 ms 1024 KB Execution killed with signal 11
2 Runtime error 4 ms 1024 KB Execution killed with signal 11
3 Runtime error 4 ms 1024 KB Execution killed with signal 11
4 Correct 206 ms 760 KB Output is correct
5 Runtime error 8 ms 1536 KB Execution killed with signal 11
6 Runtime error 8 ms 1536 KB Execution killed with signal 11
7 Runtime error 10 ms 1536 KB Execution killed with signal 11
8 Correct 207 ms 900 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 36 ms 4344 KB Execution killed with signal 11
2 Runtime error 28 ms 4352 KB Execution killed with signal 11
3 Runtime error 28 ms 4344 KB Execution killed with signal 11
4 Correct 0 ms 384 KB Output is correct
5 Runtime error 79 ms 8824 KB Execution killed with signal 11
6 Runtime error 81 ms 8824 KB Execution killed with signal 11
7 Correct 108 ms 4912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3 ms 640 KB Execution killed with signal 11
2 Runtime error 3 ms 768 KB Execution killed with signal 11
3 Runtime error 15 ms 2432 KB Execution killed with signal 11
4 Runtime error 14 ms 2432 KB Execution killed with signal 11
5 Runtime error 2 ms 640 KB Execution killed with signal 11
6 Runtime error 19 ms 2688 KB Execution killed with signal 11
7 Runtime error 5 ms 1024 KB Execution killed with signal 11
8 Runtime error 28 ms 4352 KB Execution killed with signal 11
9 Runtime error 75 ms 8824 KB Execution killed with signal 11
10 Runtime error 2 ms 640 KB Execution killed with signal 11
11 Runtime error 7 ms 1536 KB Execution killed with signal 11
12 Runtime error 68 ms 8056 KB Execution killed with signal 11
13 Runtime error 72 ms 8696 KB Execution killed with signal 11