Cod sursa(job #3136232)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 5 iunie 2023 18:04:31
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.79 kb
#include<fstream>
#include<vector>
#include<ctime>
#include<random>
using namespace std;

ifstream cin("secv8.in");
ofstream cout("secv8.out");

mt19937 rng(time(nullptr));

struct nod
{
    int v,sz,p,lazy;
    nod *c[2];
    nod(int &h) : v(h),sz(1),p(rng()),lazy(0) {c[0] = NULL,c[1] = NULL;}
    void prop()
    {
        if(!lazy) return;
        swap(c[0],c[1]);
        if(c[1]) c[1]->lazy ^= 1;
        if(c[0]) c[0]->lazy ^= 1;
        lazy = 0;
    }
};

int size(nod *&treap){return treap ? treap->sz : 0;}

void split(nod *r,nod *&st,nod *&dr,int x,int cheie)
{
    if(!r) st = NULL,dr = NULL;
    else
        {
            r->prop(); cheie += size(r->c[0]);
            if(cheie <= x) split(r->c[1],r->c[1],dr,x,cheie + 1),st = r;
            else split(r->c[0],st,r->c[0],x,cheie - size(r->c[0])),dr = r;
            r->sz = 1 + size(r->c[0]) + size(r->c[1]);
        }
}

void merge(nod *&r,nod *st,nod *dr)
{
    if(!st || !dr) r = st ? st : dr;
    else
        {
            st->prop(),dr->prop();
            if(st->p > dr->p) merge(st->c[1],st->c[1],dr),r = st;
            else merge(dr->c[0],st,dr->c[0]),r = dr;
            r->sz = 1 + size(r->c[0]) + size(r->c[1]);
        }
}

void afis(nod *&t)
{
    if(!t) return;
    t->prop();
    if(t->c[0]) afis(t->c[0]);
    cout << t->v << " ";
    if(t->c[1]) afis(t->c[1]);
}

int kth(nod *&t,int k)
{
    t->prop();
    int stanga = size(t->c[0]);
    if(stanga >= k) return kth(t->c[0],k);
    if(stanga + 1 == k) return t->v;
    return kth(t->c[1],k - stanga - 1);
}

int main()
{

    int q,a,b; char op; cin >> q >> a;
    nod *treap = NULL,*st,*dr,*mid,*haha;
    while(q--)
        {
            cin >> op >> a;
            if(op == 'I')
                {
                    cin >> b;
                    split(treap,st,dr,a - 2,0);
                    merge(st,st,new nod(b));
                    merge(treap,st,dr);
                }

            else if(op == 'A')
                {
                    cout << kth(treap,a) << '\n';
                }

            else if(op == 'R')
                {
                    cin >> b; a--,b--;
                    split(treap,st,dr,a-1,0);
                    split(dr,mid,haha,b-a,0);
                    if(mid)
                        {
                            mid->prop();
                            mid->lazy ^= 1;
                        }

                    merge(mid,mid,haha);
                    merge(treap,st,mid);                }

            else
                {
                    cin >> b; a--,b--;
                    split(treap,st,dr,a-1,0);
                    split(dr,mid,haha,b-a,0);
                    merge(treap,st,haha);
                }
        }

    afis(treap);

}