Cod sursa(job #2036178)

Utilizator andru47Stefanescu Andru andru47 Data 10 octombrie 2017 14:04:01
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.44 kb
#include <bits/stdc++.h>
#define inf 100000000
#define MOD 666013
using namespace std;
int n;
struct Treap {
    int key , priority, under;
    bool rev;
    Treap *left , *right;
    Treap() {
        key = priority = 0;
        under = 0;
        rev = false;
        left = NULL , right = NULL;
    };
    Treap(int ke , int priorit,int unde ,bool re ,Treap* &lef, Treap* &righ) {
        key = ke , priority = priorit, under = unde , rev = re, left = lef, right = righ;
    }

}*Root , *null;
inline void actualizez(Treap* &r) {
    if (r == null)
        return;
    r -> under = r -> left -> under + r -> right -> under +  1;
    return ;
}
inline void verific_intersch(Treap* &r) {
    if (r == null)
        return;
    if (r -> rev == false)
        return;
    swap(r -> left , r -> right);
    r -> left -> rev = not r -> left -> rev;
    r -> right -> rev = not r -> right -> rev;
    r -> rev = not r -> rev;
    return ;
}
inline void rotesc_stanga(Treap* &r) {
    Treap* nod = r -> left;
    r -> left = nod -> right;
    nod -> right = r;
    r = nod;
    actualizez(r -> right);
    actualizez(r);
}
inline void rotesc_dreapta(Treap* &r) {
    Treap* nod = r -> right;
    r -> right = nod -> left;
    nod -> left = r;
    r = nod;
    actualizez(r -> left);
    actualizez(r);
}
inline void balans(Treap* &r) {
    verific_intersch(r);
    if (r -> priority < r -> left -> priority)
        verific_intersch(r -> left) , rotesc_stanga(r);
    else if (r -> priority < r -> right -> priority)
        verific_intersch(r -> right) , rotesc_dreapta(r);
    return ;
}
inline void insereaza(Treap* &r , int pos, int val, int prior) {
    if (r == null) {
        r = new Treap(val , prior, 1, 0, null, null);
        return ;
    }
    verific_intersch(r);
    if (r -> left -> under + 1 >= pos)
        insereaza(r -> left , pos ,val, prior);
    else insereaza(r -> right , pos - r -> left -> under - 1, val, prior);
    actualizez(r);
    balans(r);
}
inline int access(Treap* &r, int pos) {
    verific_intersch(r);
    if (r -> left -> under + 1 == pos)
        return r -> key;
    if (r -> left -> under + 1> pos)
        return access(r -> left , pos);
    else return access(r -> right , pos - r -> left -> under - 1);
}
inline void split(Treap* &a, Treap* &b, int pos) {
    insereaza(a , pos, -1, inf);
    b = a -> right;
    a = a -> left;
    return ;
}
inline void ereis(Treap* &r) {
    if (r -> left == null && r -> right == null) {
        delete r;
        r = null;
        return ;
    }
    verific_intersch(r);
    if (r -> left -> priority > r -> right -> priority)
        verific_intersch(r -> left) , rotesc_stanga(r);
    else verific_intersch(r -> right) , rotesc_dreapta(r);

    if (r -> left -> priority == -1)
        ereis(r -> left);
    else ereis(r -> right);
    actualizez(r);

}
inline void join(Treap* &a,Treap* &b, Treap* &c) {
    a = new Treap(0 , -1, b -> under + c->under + 1, 0, b , c);
    ereis(a);
}
inline void sterge(Treap* &r, int p1, int p2) {
    Treap *a = r , *b, *c;
    split(a , b, p1);
    split(b , c, p2 - p1 + 2);
    join(r , a , c);
}
inline void print(Treap* r) {
    if (r == null)
        return ;
    verific_intersch(r);
    print(r -> left);
    printf("%d ", r -> key);
    print(r -> right);
    return ;
}
int main() {
    freopen("secv8.in" , "r", stdin);
    freopen("secv8.out" , "w", stdout);
    srand(time(0));
    int is;
    scanf("%d %d\n", &n, &is);
    null = new Treap , Root = new Treap;
    null -> under = 0;
    Root = null;
    for (int i = 1; i<=n; ++i) {
        char instr;
        int x , y;
        scanf("%c ", &instr);
        if (instr == 'I') {
            scanf("%d %d\n", &x, &y);
            insereaza(Root , x, y, rand() % MOD + 1);
            continue;
        }
        if (instr == 'A') {
            scanf("%d\n", &x);
            printf("%d\n" , access(Root , x));
            continue;
        }
        if (instr == 'R') {
            scanf("%d %d\n", &x, &y);
            Treap *a  = Root, *b, *c, *d;
            split(a , b, x);
            split(b , c, y + 1 - x + 1);
            b -> rev = not b -> rev;
            join(Root , a , b);
            d = Root;
            join(Root , d , c);
        }
        if (instr == 'D') {
            scanf("%d %d\n", &x , &y);
            sterge(Root , x , y);
        }
    }
    print(Root);
    return 0;
}