Cod sursa(job #2983306)

Utilizator bem.andreiIceman bem.andrei Data 22 februarie 2023 10:01:50
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("secv8.in");
ofstream w("secv8.out");

struct Treap
{
    int key, prio, size;
    bool rev;
    Treap* l, * r;
    Treap(int _key)
    {
        key = _key;
        prio = rand();
        size = 1;
        rev = 0;
        l = r = NULL;
    }
};

void push(Treap*& t)
{
    if (t && t->rev)
    {
        swap(t->l, t->r);
        t->rev ^= 1;
        if (t->l){
            t->l->rev ^= 1;
        }
        if (t->r){
            t->r->rev ^= 1;
        }
    }
}

int size(Treap* t)
{
    return (!t ? 0 : t->size);
}

void split(Treap* t, Treap*& l, Treap*& r, int val)
{
    if (!t)
    {
        l = r = NULL;
        return;
    }
    push(t);
    if (size(t->l) < val)
    {
        split(t->r, t->r, r, val - size(t->l) - 1);
        l = t;
    }
    else
    {
        split(t->l, l, t->l, val);
        r = t;
    }

    t->size = 1 + size(t->l) + size(t->r);
}

void merge(Treap*& t, Treap* l, Treap* r)
{
    push(l);
    push(r);
    if (!l)
    {
        t = r;
        return;
    }
    if (!r)
    {
        t = l;
        return;
    }
    if (l->prio < r->prio)
    {
        merge(l->r, l->r, r);
        t = l;
    }
    else
    {
        merge(r->l, l, r->l);
        t = r;
    }
    t->size = 1 + size(t->l) + size(t->r);
}

int get(Treap* t, int val)
{
    push(t);
    if (val == size(t->l) + 1){
        return t->key;
    }
    if (size(t->l) < val)
    {
        return get(t->r, val - size(t->l) - 1);
    }

    return get(t->l, val);
}

void reverse(Treap* t, int l, int r)
{
    Treap* a, * b, * c;
    split(t, a, b, l - 1);
    split(b, b, c, r - l + 1);
    b->rev ^= 1;
    merge(t, a, b);
    merge(t, t, c);
}

void print(Treap* t)
{
    if (!t){
        return;
    }
    push(t);
    print(t->l);
    w << t->key << " ";
    print(t->r);
}

int n, m;
int x, y;
char op;
Treap* t, * a, * b, * c;

int main()
{
    r >> m >> n;
    for (; m; m--)
    {
        r >> op >> x;
        if (op == 'I')
        {
            r >> y;
            split(t, a, b, x - 1);
            merge(a, a, new Treap(y));
            merge(t, a, b);
        }
        else if (op == 'A')
        {
            w << get(t, x) << "\n";
        }
        else if (op == 'R')
        {
            r >> y;
            reverse(t, x, y);
        }
        else
        {
            r >> y;
            split(t, a, b, x - 1);
            split(b, b, c, y - x + 1);
            merge(t, a, c);
        }
    }
    print(t);
    return 0;
}