Cod sursa(job #2886946)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 8 aprilie 2022 17:09:48
Problema Secv8 Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <bits/stdc++.h>

using namespace std;
#ifndef HOME
ifstream fin("secv8.in");
ofstream fout("secv8.out");
#else
ifstream fin("ciorna.in");
ofstream fout("ciorna.out");
#endif
unsigned seed = chrono :: system_clock :: now().time_since_epoch().count();
mt19937 rng(seed);
struct treap {
    int val, pr, sz;
    treap *l, *r;
    bool mirror;
    treap(int val) : val(val), pr(rng()), sz(1), l(NULL), r(NULL), mirror(false) {}
    friend int size(treap* t) { return t ? t -> sz : 0; }
    friend void apply(treap* t) { if(!t) return; t -> mirror ^= true; swap(t -> l, t -> r); }
    friend void prop(treap* t) { if(!t || !t -> mirror) return; t -> mirror = false; apply(t -> l); apply(t -> r); }
    friend void update(treap* t) { if(!t) return; t -> sz = 1 + size(t -> l) + size(t -> r); }
};
treap* root = NULL;
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* 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;
    }
}
void insert(int k, int e) {
    auto [l, r] = split(root, k - 1);
    root = merge(l, merge(new treap(e), r));
}
void erase(int x, int y) {
    auto [l, r1] = split(root, x - 1);
    auto [l1, r] = split(r1, y - x + 1);
    root = merge(l, r);
}
int acc(treap* t, int k) {
    prop(t);
    if(size(t -> l) >= k) return acc(t -> l, k);
    if(size(t -> l) + 1 == k) return t -> val;
    return acc(t -> r, k - size(t -> l) - 1);
}
int access(int k) { return acc(root, k); }
void reverse(int x, int y) {
    auto [l, r1] = split(root, x - 1);
    auto [l1, r] = split(root, y - x + 1);
    apply(l1);
    root = merge(l, merge(l1, r));
}
void print(treap* t) {
    if(!t) return;
    prop(t);
    print(t -> l);
    fout << t -> val << " ";
    print(t -> r);
}

int main()
{
    int n, c;
    fin >> n >> c;
    for(int i = 1; i <= n; i++) {
        char t; int k, e, l, r;
        fin >> t;
        if(t == 'I') { fin >> k >> e; insert(k, e); }
        if(t == 'A') { fin >> k; fout << access(k) << "\n"; }
        if(t == 'R') { fin >> l >> r; reverse(l, r); }
        if(t == 'D') { fin >> l >> r; erase(l, r); }
    }
    print(root);
    return 0;
}