Cod sursa(job #2950360)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 3 decembrie 2022 15:44:33
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <bits/stdc++.h>

using namespace std;
struct node {
    node *par;
    array <node*, 2> ch;
    int x, sz;
    bool mirror;
    node(int val = -1) : par(NULL), ch({NULL, NULL}), x(val), sz(1), mirror(false) {}
    friend int size(node *t) { return t ? t -> sz : 0; }
    bool side() { return par && (par -> ch[1] == this); }
    friend void update(node *t) { if(!t) return; t -> sz = 1 + size(t -> ch[0]) + size(t -> ch[1]); }
    friend void rev(node *t) { if(!t) return; t -> mirror ^= 1; swap(t -> ch[0], t -> ch[1]); }
    friend void prop(node *t) { if(!t || !t -> mirror) return; t -> mirror = 0; rev(t -> ch[0]); rev(t -> ch[1]); }
    void attach(bool s, node *t) {
        ch[s] = t;
        update(this);
        if(t) t -> par = this;
    }
    node *detach(bool side) {
        prop(this);
        node *s = ch[side];
        if(s) {
            s -> par = NULL;
            ch[side] = NULL;
            update(this);
        }
        return s;
    }
    void rotate() {
        node *p = par;
        if(!p) return;
        bool s = side();
        if(p -> par) p -> par -> attach(p -> side(), this);
        else par = NULL;
        p -> attach(s, ch[!s]);
        attach(!s, p);
    }
    node *splay(node *pp = NULL) {
        prop(this);
        for(; par != pp; rotate())
            if(par -> par && par -> par != pp && par -> side() == side())
                par -> rotate();
        return this;
    }
    node *find(int k) {
        node *t = this;
        while(t) {
            prop(t);
            if(k == size(t -> ch[0]) + 1) break;
            if(k > size(t -> ch[0])) {
                k -= size(t -> ch[0]) + 1;
                t = t -> ch[1];
            } else t = t -> ch[0];
        }
        return t;
    }
};
node *root;
node *splice(int i, int j) {
    root = root -> find(i) -> splay();
    node *right = root -> find(j + 2) -> splay(root);
    return right -> ch[0];
}
void reverse(int i, int j) {
    rev(splice(i, j));
}
node *merge(node *l, node *r) {
    if(!l) return r;
    if(!r) return l;
    node *t = l -> find(size(l)) -> splay();
    t -> attach(1, r);
    return t;
}
void insert(int k, int x) {
    root = root -> find(k) -> splay();
    node *r = root -> detach(1);
    node *t = new node(x);
    t -> attach(1, r);
    root -> attach(1, t);
}
void destroy(node *t) {
    if(!t) return;
    destroy(t -> ch[0]);
    destroy(t -> ch[1]);
    delete t;
}
void del(int i, int j) {
    node *t = splice(i, j);
    destroy(t -> par -> detach(t -> side()));
}

int main()
{
    ifstream cin("secv8.in");
    ofstream cout("secv8.out");
    root = merge(new node(), new node());
    int q, aux;
    auto print = [&](node *t, auto self) {
        if(!t) return;
        prop(t);
        self(t -> ch[0], self);
        if(t -> x > -1) cout << t -> x << " ";
        self(t -> ch[1], self);
    };

    cin >> q >> aux;
    while(q--) {
        char type;
        int k, i, j, x;
        cin >> type;
        switch(type) {
            case 'I': cin >>k >> x; insert(k, x); break;
            case 'R': cin >> i >> j; reverse(i, j); break;
            case 'D': cin >> i >> j; del(i, j); break;
            case 'A': cin >> k; cout << root -> find(k + 1) -> x << "\n"; break;
        }
    }
    print(root, print);
    return 0;
}