Cod sursa(job #2414067)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 24 aprilie 2019 02:38:34
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.03 kb
#include <bits/stdc++.h>

using namespace std;

struct node
{
    int val,pr,sz,flp;
    node *st,*dr;
    node(node *st_,node *dr_,int val_,int pr_)
    {
        st=st_;
        dr=dr_;
        val=val_;
        pr=pr_;
        sz=st->sz+dr->sz+1;
        flp=0;
    }
    node()
    {
        pr=-1;
        sz=0;
        flp=0;
    }
};

node *nil,*rad;

void propag(node *nod)
{
    if(nod->flp)
    {
        swap(nod->st,nod->dr);
        nod->st->flp^=1;
        nod->dr->flp^=1;
        nod->flp=0;
    }
}

void update(node *nod)
{
    nod->sz=nod->st->sz+nod->dr->sz+1;
}

pair<node*,node*> split(node *nod,int poz)
{
    if(nod==nil) return {nil,nil};
    propag(nod);
    if(poz<=nod->st->sz)
    {
        pair<node*,node*> aux=split(nod->st,poz);
        nod->st=aux.second;
        update(nod);
        return {aux.first,nod};
    }
    else
    {
        pair<node*,node*> aux=split(nod->dr,poz-nod->st->sz-1);
        nod->dr=aux.first;
        update(nod);
        return {nod,aux.second};
    }
}

node* join(node *st,node *dr)
{
    if(st==nil && dr==nil) return nil;
    propag(st);
    propag(dr);
    if(st->pr>dr->pr)
    {
        st->dr=join(st->dr,dr);
        update(st);
        return st;
    }
    else
    {
        dr->st=join(st,dr->st);
        update(dr);
        return dr;
    }
}

void dfs(node* nod)
{
    if(nod==nil) return;
    propag(nod);
    dfs(nod->st);
    printf("%d ",nod->val);
    dfs(nod->dr);
}

int random(int a,int b)
{
    return a+(1LL*rand()*rand()+rand())%(b-a+1);
}

int main()
{
    freopen("secv8.in","r",stdin);
    freopen("secv8.out","w",stdout);
    srand(time(0));
    int q,c,poz,x,l,r;
    char tip;
    scanf("%d%d",&q,&c);
    nil=new node();
    nil->st=nil->dr=nil;
    rad=nil;
    for(int i=1;i<=q;i++)
    {
        scanf("\n%c",&tip);
        if(tip=='I')
        {
            scanf("%d%d",&poz,&x);
            pair<node*,node*> aux=split(rad,poz-1);
            node* nod=new node(nil,nil,x,random(1,1e9));
            rad=join(aux.first,nod);
            rad=join(rad,aux.second);
        }
        else if(tip=='A')
        {
            scanf("%d",&poz);
            pair<node*,node*> aux1=split(rad,poz-1);
            pair<node*,node*> aux2=split(aux1.second,1);
            printf("%d\n",aux2.first->val);
            rad=join(aux1.first,aux2.first);
            rad=join(rad,aux2.second);
        }
        else if(tip=='R')
        {
            scanf("%d%d",&l,&r);
            pair<node*,node*> aux1=split(rad,l-1);
            pair<node*,node*> aux2=split(aux1.second,r-l+1);
            aux2.first->flp^=1;
            rad=join(aux1.first,aux2.first);
            rad=join(rad,aux2.second);
        }
        else
        {
            scanf("%d%d",&l,&r);
            pair<node*,node*> aux1=split(rad,l-1);
            pair<node*,node*> aux2=split(aux1.second,r-l+1);
            rad=join(aux1.first,aux2.second);
        }
    }
    dfs(rad);
    return 0;
}