Cod sursa(job #2985645)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 26 februarie 2023 18:59:14
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.58 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("secv8.in");
ofstream fout("secv8.out");
mt19937 rng(chrono::steady_clock().now().time_since_epoch().count());
//mt19937 rng(1348729);
int AlinM_APusSaFacAsta,DeCeDoamneImiDaiTreap;
struct node
{
    node *l,*r;
    int subtreesize;
    int val;
    int pri;
    int toprop;
    node()
    {
        l=NULL;
        r=NULL;
        subtreesize=1;
        pri=rng();
        toprop=0;
    }
};
node *t;
int size(node* v)
{
    if(v==NULL)
        return 0;
    return v->subtreesize;
}
void prop(node* me)
{
    if(me==NULL)
        return;
    if(me->toprop%2==1)
    {
        me->toprop=0;
        swap(me->l,me->r);
        if(me->l!=NULL)
            me->l->toprop++;
        if(me->r!=NULL)
            me->r->toprop++;
    }
    me->toprop=0;
}
void recalc(node* me)
{
    if(me==NULL)
        return;
    prop(me);
    me->subtreesize=1+size(me->l)+size(me->r);
}
node* merge(node* a, node* b)
{
    if(a==NULL)
        return b;
    if(b==NULL)
        return a;
    prop(a);
    prop(b);
    if(a->pri>b->pri)
    {
        node* rgt=merge(a->r,b);
        recalc(rgt);
        a->r=rgt;
        recalc(a);
        return a;
    }
    else
    {
        node* lft=merge(a,b->l);
        recalc(lft);
        b->l=lft;
        recalc(b);
        return b;
    }
}
array<node*,2> split(node* me, int poz)
{
    if(me==NULL)
        return {NULL,NULL};
    prop(me);
    if(poz==0)
        return {NULL,me};
    if(poz==size(me))
        return {me,NULL};
    if(poz<=size(me->l))
    {
        array<node*,2> b=split(me->l,poz);
        node* lft=b[0];
        node* rgt=me;
        rgt->l=b[1];
        recalc(lft);
        recalc(rgt);
        return {lft,rgt};
    }
    else
    {
        array<node*,2> b=split(me->r,poz-size(me->l)-1);
        node* rgt=b[1];
        node* lft=me;
        lft->r=b[0];
        recalc(lft);
        recalc(rgt);
        return {lft,rgt};
    }
}
void putin(int poz,int val)
{
    array<node*,2> b=split(t,poz-1);
    node* me = new node;
    me->val=val;
    t=merge(b[0],me);
    t=merge(t,b[1]);
}
int getval(int poz)
{
    array<node*,2> b=split(t,poz-1);
    node* u=b[0],*w=b[1];
    array<node*,2> c=split(b[1],1);
    int rez=c[0]->val;
    t=merge(b[0],c[0]);
    t=merge(t,c[1]);
    return rez;
}
void CelMaiReverse(int l,int r)
{
    array<node*,2> b=split(t,l-1);
    array<node*,2> c=split(b[1],r-l+1);
    swap(c[0]->l,c[0]->r);
    if(c[0]->l!=NULL)
        c[0]->l->toprop++;
    if(c[0]->r!=NULL)
        c[0]->r->toprop++;
    t=merge(b[0],c[0]);
    t=merge(t,c[1]);
}
void ScoatelDalIncolo(int l,int r)
{
    array<node*,2> b=split(t,l-1);
    array<node*,2> c=split(b[1],r-l+1);
    t=merge(b[0],c[1]);
}
int main()
{
    fin>>DeCeDoamneImiDaiTreap>>AlinM_APusSaFacAsta;
    int cnt=0;
    while(DeCeDoamneImiDaiTreap--)
    {
        char c;
        fin>>c;
        cnt++;
        if(c=='I')
        {
            int poz,val;
            fin>>poz>>val;
            putin(poz,val);
        }
        if(c=='A')
        {
            int poz;
            fin>>poz;
            fout<<getval(poz)<<'\n';
        }
        if(c=='R')
        {
            int st,dr;
            fin>>st>>dr;
            CelMaiReverse(st,dr);
        }
        if(c=='D')
        {
            int st,dr;
            fin>>st>>dr;
            ScoatelDalIncolo(st,dr);
        }
    }
    int n=size(t);
    for(int i=1;i<=n;i++)
        fout<<getval(i)<<' ';
    return 0;
}