Cod sursa(job #2984805)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 24 februarie 2023 22:30:34
Problema Secv8 Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.3 kb
#include <bits/stdc++.h>
using namespace std;

struct Treap
{
    int sz, val, prio;
    bool rev_lazy;
    Treap *st, *dr;
    Treap(int sz = 0, int val = 0, int prio = 0)
    {
        this->sz = sz;
        this->val = val;
        this->prio = prio;
        this->rev_lazy = 0;
        st = dr = NULL;
    }
};

void push(Treap *nod)
{
    if(nod == NULL || nod->rev_lazy == 0)
        return;
    swap(nod->st, nod->dr);
    nod->rev_lazy = 0;
    if(nod->st != NULL)
        nod->st->rev_lazy ^= 1;
    if(nod->dr != NULL)
        nod->dr->rev_lazy ^= 1;
}

int marime(Treap *nod)
{
    if(nod == NULL)
        return 0;
    return nod->sz;
}

Treap* merge(Treap *t1, Treap *t2)
{
    push(t1);
    push(t2);
    if(t1 == NULL)
        return t2;
    if(t2 == NULL)
        return t1;
    if(t1->prio > t2->prio)
    {
        t1->dr = merge(t1->dr, t2);
        t1->sz = marime(t1->st) + 1 + marime(t1->dr);
        return t1;
    }
    else
    {
        t2->st = merge(t1, t2->st);
        t2->sz = marime(t2->st) + 1 + marime(t2->dr);
        return t2;
    }
}

pair <Treap*, Treap*> split(Treap *nod, int cate)
{
    push(nod);
    if(nod == NULL)
        return {NULL, NULL};
    if(cate == marime(nod))
        return {nod, NULL};
    if(cate == 0)
        return {NULL, nod};
    if(cate <= marime(nod->st))
    {
        pair <Treap*, Treap*> aux = split(nod->st, cate);
        nod->st = aux.second;
        nod->sz = marime(nod->st) + 1 + marime(nod->dr);
        return {aux.first, nod};
    }
    else
    {
        pair <Treap*, Treap*> aux = split(nod->dr, cate - marime(nod->st) - 1);
        nod->dr = aux.first;
        nod->sz = marime(nod->st) + 1 + marime(nod->dr);
        return {nod, aux.second};
    }
}

Treap *rad = new Treap;

void afis(Treap* nod)
{
    if(nod == NULL)
        return;
    afis(nod->st);
    cout << nod->val << " ";
    afis(nod->dr);
}

int main()
{
    freopen("secv8.in", "r", stdin);
    freopen("secv8.out", "w", stdout);
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    int t, x, y;
    char c;
    cin >> t >> x;
    while(t--)
    {
        cin >> c;
        if(c == 'I')
        {
            cin >> x >> y;
            pair <Treap*, Treap*> rez = split(rad, x - 1);
            rad = merge(merge(rez.first, new Treap(1, y, rng() % INT_MAX)), rez.second);
        }
        else if(c == 'A')
        {
            cin >> x;
            pair <Treap*, Treap*> rez = split(rad, x);
            pair <Treap*, Treap*> rez2 = split(rez.first, x - 1);
            cout << rez2.second->val << '\n';
            rad = merge(merge(rez2.first, rez2.second), rez.second);
        }
        else if(c == 'R')
        {
            cin >> x >> y;
            pair <Treap*, Treap*> rez = split(rad, y);
            pair <Treap*, Treap*> rez2 = split(rez.first, x - 1);
            rez2.second->rev_lazy ^= 1;
            rad = merge(merge(rez2.first, rez2.second), rez.second);
        }
        else if(c == 'D')
        {
            cin >> x >> y;
            pair <Treap*, Treap*> rez = split(rad, y);
            pair <Treap*, Treap*> rez2 = split(rez.first, x - 1);
            rad = merge(rez2.first, rez.second);
        }
    }
    afis(rad);
    return 0;
}