Submission #285906

# Submission time Handle Problem Language Result Execution time Memory
285906 2020-08-29T18:06:45 Z caoash Cake (CEOI14_cake) C++14
35 / 100
2000 ms 29284 KB
#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 query(int v, int l, int r, int ql, int qr) {
        if (l > qr || r < ql) {
            return 0;
        } else if (l >= ql && r <= qr) {
            return tree[v];
        } else {
            int m = (l + r) / 2;
            T a = query(2 * v + 1, l, m, ql, qr);
            T b = query(2 * v + 2, m + 1, r, ql, qr);
            return merge(a,b);
        }
    }
};

const int MX = 200005;

unordered_map<int, int> pos;

Seg<int, MX> vals; 

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;
        vals.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;
    vi top;
    for (int i = max(1, n - 9); i <= n; i++) {
        top.pb(i);
    }
    while(q--) {
        char qt; cin >> qt; 
        if (qt == 'E') {
            int i, e; cin >> i >> e;
            i--;
            vi order;
            /* 
            cout << "TOP: " << '\n';
            for (int x : top) {
                cout << x << " ";
            }
            cout << '\n';
            */
            for (int j = 0; j < e - 1; j++) {
                if (pos[top.back()] != i) {
                    order.pb(top.back() + 1);
                    vals.update(0, 0, n - 1, pos[top.back()], top.back() + 1);
                    d[pos[top.back()]] = top.back() + 1;
                    pos[top.back() + 1] = pos[top.back()];
                }
                else {
                    j--;
                }
                top.pop_back();
            }
            int prev = d[i];
            // cout << "prev: " << prev << endl;
            d[i] = top.back() + 1;
            vals.update(0, 0, n - 1, i, top.back() + 1);
            order.pb(top.back() + 1);
            pos[top.back() + 1] = i;
            while (!top.empty()) {
                if(top.back() != prev) order.pb(top.back());
                top.pop_back(); 
            }
            reverse(all(order));
            for (int x : order) {
                top.pb(x);
            }
            /*
            cout << "vals: " << '\n';
            for (int j = 0; j < n; j++) {
                cout << d[j] << " ";
            }
            cout << '\n';
            */
        }
        else {
            int x; cin >> x;
            x--;
            if (x == a) { 
                cout << 0 << '\n';
                continue;
            }
            int best = 0;
            if (x < a) best = vals.query(0, 0, n - 1, x, a - 1);
            else if (x > a) best = vals.query(0, 0, n - 1, a + 1, x);
            if (x < a) {
                int lo = a + 1; int hi = n - 1;
                int ans = n;
                while (lo <= hi) {
                    int mid = (lo + hi) / 2;
                    if (vals.query(0, 0, n - 1, a + 1, mid) > best) {
                        ans = mid;
                        hi = mid - 1;
                    }
                    else {
                        lo = mid + 1;
                    }
                }
                cout << (ans - x - 1) << '\n';
            }
            else {
                int lo = 0; int hi = a - 1;
                int ans = -1;
                while (lo <= hi) {
                    int mid = (lo + hi) / 2;
                    if (vals.query(0, 0, n - 1, mid, a - 1) > best) {
                        ans = mid;
                        lo = mid + 1;
                    }
                    else {
                        hi = mid - 1;
                    }
                }
                cout << (x - ans - 1) << '\n';
            }
        }
    }
}

# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 19 ms 512 KB Output is correct
5 Correct 100 ms 1144 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 2098 ms 3964 KB Time limit exceeded
2 Execution timed out 2096 ms 8268 KB Time limit exceeded
3 Execution timed out 2095 ms 4228 KB Time limit exceeded
4 Correct 356 ms 20584 KB Output is correct
5 Execution timed out 2082 ms 4460 KB Time limit exceeded
6 Execution timed out 2078 ms 4764 KB Time limit exceeded
7 Execution timed out 2100 ms 4640 KB Time limit exceeded
8 Correct 352 ms 29284 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 386 ms 6564 KB Output is correct
2 Correct 293 ms 6428 KB Output is correct
3 Correct 301 ms 6300 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 407 ms 14016 KB Output is correct
6 Correct 509 ms 14016 KB Output is correct
7 Correct 514 ms 13632 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 578 ms 1720 KB Output is correct
2 Correct 816 ms 1912 KB Output is correct
3 Execution timed out 2075 ms 5396 KB Time limit exceeded
4 Execution timed out 2076 ms 5276 KB Time limit exceeded
5 Correct 1292 ms 4356 KB Output is correct
6 Execution timed out 2085 ms 5676 KB Time limit exceeded
7 Execution timed out 2066 ms 2916 KB Time limit exceeded
8 Execution timed out 2074 ms 8964 KB Time limit exceeded
9 Execution timed out 2073 ms 17632 KB Time limit exceeded
10 Execution timed out 2079 ms 6092 KB Time limit exceeded
11 Execution timed out 2092 ms 3300 KB Time limit exceeded
12 Execution timed out 2091 ms 12864 KB Time limit exceeded
13 Execution timed out 2047 ms 17600 KB Time limit exceeded