Cod sursa(job #2095079)

Utilizator mihai.alphamihai craciun mihai.alpha Data 26 decembrie 2017 21:41:39
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.76 kb
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define VI vector<int>
#define PII pair<int,int>
#define PDD pair<double,double>
#define ll long long
#define lf double
#define pb push_back
#define For(i, j, n)for(int i = j;i <= n;i++)
#define iFor(i, j, n)for(int i = n;i >= j;i--)
#define R scanf
#define S scanf
#define P printf
#define fin stdin
#define fout stdout

#define DBG 1

struct nod  {
    int key, size;
    int prio;
    bool flip;
    nod *l, *r;
} nil {};

inline void prop(nod *n)  {
    if(n -> flip)  {
        n -> flip = 0;
        swap(n -> l, n -> r);
        n -> l -> flip ^= 1;
        n -> r -> flip ^= 1;
    }
}

inline void actual(nod *n)  {
    n -> size = n -> l -> size + n -> r -> size + 1;
}

nod *join(nod *l, nod *r)  {
    if(l == &nil)
        return r;
    if(r == &nil)
        return l;
    prop(l), prop(r);
    if(l -> prio >= r -> prio)  {
        l -> r = join(l -> r, r);
        actual(l);
        return l;
    }
    else  {
        r -> l = join(l, r -> l);
        actual(r);
        return r;
    }
}

pair <nod*, nod*> split(nod *n, int poz)  {
    if(n == &nil)
        return {&nil, &nil};
    prop(n);
    if(n -> l -> size == poz)  {
        nod *aux = n -> l;
        n -> l = &nil;
        actual(n);
        return {aux, n};
    }
    else if(n -> l -> size < poz)  {
        pair <nod*, nod*> aux = split(n -> r, poz - n -> l -> size - 1);
        n -> r = aux.fi;
        aux.fi = n;
        actual(n);
        return aux;
    }
    else  {
        pair <nod*, nod*> aux = split(n -> l, poz);
        n -> l = aux.se;
        aux.se = n;
        actual(n);
        return aux;
    }
}

nod *insert(nod *n, int poz, int key)  {
    pair <nod*, nod*> p = split(n, poz);
    return join(join(p.fi, new nod {key, 1, rand(), 0, &nil, &nil}), p.se);
}

int see(nod *n, int poz)  {
    prop(n);
    if(n -> l -> size == poz)
        return n -> key;
    else if(n -> l -> size > poz)
        return see(n -> l, poz);
    else return see(n -> r, poz - n -> l -> size - 1);
}

tuple <nod*, nod*, nod*> triple_split(nod *n, int poz1, int poz2)  {
    pair <nod*, nod*> aux = split(n, poz2), aux1 = split(aux.fi, poz1);
    return make_tuple(aux1.fi, aux1.se, aux.se);
}

nod *reverse(nod *n, int c1, int c2)  {
    tuple <nod*, nod*, nod*> aux = triple_split(n, c1, c2);
    get <1> (aux) -> flip ^= 1;
    return join(join(get <0> (aux), get <1> (aux)), get <2> (aux));
}

nod *erase(nod *n, int c1, int c2)  {
    tuple <nod*, nod*, nod*> aux = triple_split(n, c1, c2);
    return join(get <0> (aux), get <2> (aux));
}

void dfs(nod *n)  {
    if(n == &nil)
        return;
    prop(n);
    dfs(n -> l);
    printf("%d ", n -> key);
    dfs(n -> r);
}

int main()  {
    srand(time(0));
	if(DBG)  {
		freopen("secv8.in", "r", stdin);
		freopen("secv8.out", "w", stdout);
	}
    int op, III;
    R("%d%d", &op, &III);
    getchar();
    nod * rad = &nil;
    while(op--)  {
        char c;
        c = getchar();
        if(c == 'I')  {
            int poz, key;
            scanf("%d%d", &poz, &key);
            getchar();
            rad = insert(rad, poz - 1, key);
        }
        else if(c == 'A')  {
            int poz;
            scanf("%d", &poz);
            getchar();
            printf("%d\n", see(rad, poz - 1));
        }
        else if(c == 'R')  {
            int c1, c2;
            scanf("%d%d", &c1, &c2);
            getchar();
            rad = reverse(rad, c1 - 1, c2);
        }
        else  {
            int c1, c2;
            scanf("%d%d", &c1, &c2);
            getchar();
            rad = erase(rad, c1 - 1, c2);
        }
    }
    dfs(rad);
	return 0;
}