Cod sursa(job #2877521)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 24 martie 2022 20:56:29
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("secv8.in");
ofstream fout("secv8.out");

mt19937 mt(time(0));

const int inf=2e9;

struct nod{
    int key;
    int pr;
    int cnt;
    bool isrev;
    nod *l, *r;
    nod(int x):key(x),pr(mt()),cnt(1),isrev(0),l(NULL),r(NULL){}
};

typedef nod* treap;

treap root;

bool b;
int q;

string s;
int x,y;

int cnt(treap t)
{
    if(t)return t->cnt;
    return 0;
}

void push(treap t)
{
    if(!t)return;
    if(!t->isrev)return;
    t->isrev=0;
    swap(t->l,t->r);
    if(t->l)t->l->isrev ^= 1;
    if(t->r)t->r->isrev ^= 1;
}

void upd(treap t)
{
    if(!t)return;
    t->cnt=cnt(t->l)+cnt(t->r)+1;
}

void split(treap t, treap &st, treap &dr, int x, int ad = 0)
{
    if(!t){st=dr=NULL;return;}
    push(t);
    int cheie = ad + cnt(t->l);
    if(x<=cheie)split(t->l,st,t->l,x,ad),dr=t;
    else split(t->r,t->r,dr,x,cheie+1),st=t;
    upd(t);
}

void mer(treap &t, treap st, treap dr)
{
    push(st);
    push(dr);
    if(!st)t=dr;
    else if(!dr)t=st;
    else if(st->pr>dr->pr)mer(st->r,st->r,dr),t=st;
    else mer(dr->l,st,dr->l),t=dr;
    upd(t);
}

int keyy(treap t)
{
    if(t)return t->key;
    return -1;
}

int care(int x)
{
    x--;
    treap t1,t2,t3;
    split(root,t1,t2,x);
    split(t2,t2,t3,1);
    int rez = keyy(t2);
    mer(root,t1,t2);
    mer(root,root,t3);
    return rez;
}

void ins(int poz, int x)
{
    poz--;
    treap maimic,maimare;
    treap toins = new nod(x);
    split(root,maimic,maimare,poz);
    mer(root,maimic,toins);
    mer(root,root,maimare);
}

void sterge(int x, int y)
{
    x--;
    y--;
    treap maimic, maimare, trash;
    split(root,maimic,maimare,x);
    split(maimare,trash,maimare, y - x + 1);
    mer(root,maimic,maimare);
}

void rev(int x, int y)
{
    x--;
    y--;
    treap maimic, maimare, trash;
    split(root,maimic,maimare,x);
    split(maimare,trash,maimare, y - x + 1);
    if(trash)trash->isrev^=1;
    mer(root,maimic,trash);
    mer(root,root,maimare);
}

void afis(treap t)
{
    if(!t)return;
    push(t);
    afis(t->l);
    fout<<t->key<<' ';
    afis(t->r);
}

signed main()
{
    fin>>q>>b;
    while(q--)
    {
        fin>>s>>x;
        if(s=="A")fout<<care(x)<<'\n';
        else {
            fin>>y;
            if(s=="I")ins(x,y);
            else if(s=="R")rev(x,y);
            else sterge(x,y);
        }
    }
    afis(root);
    return 0;
}