Cod sursa(job #2944776)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 22 noiembrie 2022 22:29:31
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <bits/stdc++.h>

using namespace std;
unsigned seed = chrono :: system_clock :: now().time_since_epoch().count();
mt19937 rng(seed);
struct treap {
    int x, sz, pr;
    bool rev;
    treap *l, *r;
    treap(int x) : x(x), sz(1), pr(rng()), l(NULL), r(NULL), rev(false) {}
    friend int size(treap *t) { return t ? t -> sz : 0; }
    friend void update(treap *t) { if(!t) return; t -> sz = 1 + size(t -> l) + size(t -> r); }
    friend void mirror(treap *t) { if(!t) return; t -> rev ^= 1; swap(t -> l, t -> r); }
    friend void prop(treap *t) { if(!t || !t -> rev) return; t -> rev = 0; mirror(t -> l); mirror(t -> r); }
};
treap *merge(treap *l, treap *r) {
    if(!l) return r;
    if(!r) return l;
    prop(l); prop(r);
    if(l -> pr >= r -> pr) {
        l -> r = merge(l -> r, r);
        update(l);
        return l;
    } else {
        r -> l = merge(l, r -> l);
        update(r);
        return r;
    }
}
array <treap*, 2> split(treap *t, int k) {
    if(!t) return {NULL, NULL};
    prop(t);
    if(size(t -> l) >= k) {
        auto [l, r] = split(t -> l, k);
        t -> l = r;
        update(t);
        return {l, t};
    } else {
        auto [l, r] = split(t -> r, k - size(t -> l) - 1);
        t -> r = l;
        update(t);
        return {t, r};
    }
}
treap *root = NULL;
int& access(treap *t, int k) {
    prop(t);
    if(size(t -> l) >= k) return access(t -> l, k);
    if(size(t -> l) + 1 == k) return t -> x;
    return access(t -> r, k - size(t -> l) - 1);
}
array <treap*, 3> splice(treap *t, int a, int b) { /// Splice [a, b)
    auto [aux, r] = split(t, b);
    auto [l, m] = split(aux, a);
    return {l, m, r};
}
void insert(int k, int val) {
    auto [l, r] = split(root, k);
    root = merge(l, merge(new treap(val), r));
}
void del(int a, int b) {
    auto [l, m, r] = splice(root, a, b);
    root = merge(l, r);
}
void mirror(int a, int b) {
    auto [l, m, r] = splice(root, a, b);
    mirror(m);
    root = merge(l, merge(m, r));
}

int main()
{
    ifstream cin("secv8.in");
    ofstream cout("secv8.out");
    int q, aux;
    cin >> q >> aux;
    while(q--) {
        char type;
        int k, i, j, x;
        cin >> type;
        switch(type) {
            case 'I': cin >>k >> x; insert(k - 1, x); break;
            case 'R': cin >> i >> j; mirror(i - 1, j); break;
            case 'D': cin >> i >> j; del(i - 1, j); break;
            case 'A': cin >> k; cout << access(root, k) << "\n"; break;
        }
    }
    auto print = [&](treap *t, auto self) {
        if(!t) return;
        prop(t);
        self(t -> l, self);
        cout << t -> x << " ";
        self(t -> r, self);
    };
    print(root, print);
    return 0;
}