Cod sursa(job #2008405)

Utilizator KusikaPasa Corneliu Kusika Data 6 august 2017 14:48:25
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <bits/stdc++.h>
using namespace std;

typedef struct Treap {
    int prio, id, sz, rv;
    Treap *l, *r;

    void update() {
        sz = 1;
        if (l != 0) sz += l->sz;
        if (r != 0) sz += r->sz;
        if (rv) {
            rv = 0;
            swap(l,r);
            if (l != 0) l->rv ^= 1;
            if (r != 0) r->rv ^= 1;
        }
    }

    Treap(int key) { id = key, sz = 1, prio = rand() + 1, rv = 0, l = r = 0; }
} *T;

int getSize(T n) {
    if (!n) return 0;
    n->update();
    return n->sz;
}

T Merge(T l, T r) {
    if (!l) return r;
    if (!r) return l;
    l->update(), r->update();
    if (l->prio >= r->prio) {
        l->r = Merge(l->r,r);
        l->update();
        return l;
    } else {
        r->l = Merge(l,r->l);
        r->update();
        return r;
    }
}

void Split(T n, int pos, T &l, T &r) {
    l = r = 0;
    if (!n) return;
    n->update();
    int p = getSize(n->l) + 1;
    if (p < pos) {
        Split(n->r,pos-p,n->r,r);
        l = n;
        l->update();
    } else {
        Split(n->l,pos,l,n->l);
        r = n;
        r->update();
    }
}

T Insert(T n, int pos, int id) {
    T l, r;
    Split(n,pos,l,r);
    return Merge(Merge(l, new Treap(id)), r);
}

int Get(T &n, int pos) {
    T l, mi, r;
    Split(n,pos,l,mi);
    Split(mi,2,mi,r);
    n = Merge(Merge(l,mi),r);
    return mi->id;
}

T Delete(T n, int lpos, int rpos) {
    T l, mi, r;
    Split(n,rpos+1,mi,r);
    Split(mi,lpos,l,mi);
    delete(mi);
    return Merge(l,r);
}

T Reverse(T n, int lpos, int rpos) {
    T l, mi, r;
    Split(n,rpos+1,mi,r);
    Split(mi,lpos,l,mi);
    mi->rv ^= 1;
    return Merge(Merge(l,mi), r);
}

int main() {
    srand(time(nullptr));
	freopen("secv8.in","r",stdin);
    freopen("secv8.out","w",stdout);
    ios_base::sync_with_stdio(0);
    int q, v;
    cin >> q >> v;

    T root = 0;

    while (q--) {
        int k, e, i, j;
        char ch;
        cin >> ch;
        if (ch == 'I') {
            cin >> k >> e;
            root = Insert(root,k,e);
        } else if (ch == 'A') {
            cin >> k;
            printf("%d\n", Get(root,k));
        } else {
            cin >> i >> j;
            if (ch == 'R') root = Reverse(root,i,j);
            else root = Delete(root,i,j);
        }
    }
    int n = getSize(root);
    for (int i = 1; i <= n; i++) printf("%d ", Get(root,i));
}