Submission #402556

#TimeUsernameProblemLanguageResultExecution timeMemory
402556gevacrtEditor (BOI15_edi)C++17
100 / 100
492 ms270420 KiB
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

typedef vector<int> vi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

#define INF INT_MAX
#define MOD 1000000007
#define all(x) x.begin(), x.end()

struct PersTree {
    PersTree *l, *r;
    int key, val, max_val;

    PersTree(PersTree *_l, PersTree *_r, int _key, int _val, int _max_val) : 
        l(_l), r(_r), key(_key), val(_val), max_val(_max_val) {}

    PersTree *insert(int _key, int _val){
        PersTree *_l = l, *_r = r;
        int nval = val;

        if(_key < key) _l = _l->insert(_key, _val);
        else if(_key == key) nval = _val;
        else _r = _r->insert(_key, _val);

        return new PersTree(_l, _r, key, nval, max({(_l?_l->max_val:0), nval, (_r?_r->max_val:0)}));
    }

    int query(int _key){
        if(_key < key) return l->query(_key);
        else if(_key == key) return max((l?l->max_val:0), val);
        else return max({(l?l->max_val:0), val, r->query(_key)});
    }
};

PersTree *build(int left, int right){
    if(left > right) return NULL;
    int m = (left+right)/2;
    return new PersTree(build(left, m-1), build(m+1, right), m, 0, 0);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N; cin >> N;

    vector<PersTree*> A(N+1);
    A[0] = build(0, N);
    vi ans(N+1);

    for(int i = 1; i <= N; i++){
        int x; cin >> x;
        if(x > 0){
            // write operation
            ans[i] = x;
            A[i] = A[i-1]->insert(0, i);

        }else{
            // undo operation
            int prv = A[i-1]->query(-x-1)-1;
            ans[i] = ans[prv];
            A[i] = A[prv]->insert(-x, i);
        }
        cout << ans[i] << "\n";
        A[1]->query(10);
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...