Cod sursa(job #2656968)

Utilizator iulianarsenoiuArsenoiu Iulian iulianarsenoiu Data 9 octombrie 2020 12:13:08
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("secv8.in");
ofstream g("secv8.out");
struct nod
{
    nod *st,*dr;
    int val,sz, prior;
    bool rev;
};
nod nil;
nod *rad = &nil;
nod *propag(nod *n)
{
    if(n==&nil)
    {
        return n;
    }
    if(n->rev==true)
    {
        swap(n->st,n->dr);
        n->rev=false;
        n->st->rev^=1;
        n->dr->rev^=1;
    }
    return n;
}
nod *mod_fiu(nod *n, int care, nod *f)
{
    if(care==0)
    {
        n->st=f;
    }
    else
    {
        n->dr=f;
    }
    n->sz=n->st->sz + 1 + n->dr->sz;
    return n;
}
pair<nod*,nod*> split(nod *n, int k)
{
    n = propag(n);
    if(n==&nil)
    {
        return {&nil,&nil};
    }
    if(n->st->sz>=k)
    {
        auto t = split(n->st,k);
        return {t.first,mod_fiu(n,0,t.second)};
    }
    else
    {
        auto t = split(n->dr,k - n->st->sz - 1);
        return {mod_fiu(n,1,t.first),t.second};
    }
}
nod *join(nod *st, nod *dr)
{
    st = propag(st);
    dr = propag(dr);
    if(st==&nil)
    {
        return dr;
    }
    if(dr==&nil)
    {
        return st;
    }
    if(st->prior>=dr->prior)
    {
        return mod_fiu(st,1,join(st->dr,dr));
    }
    return mod_fiu(dr,0,join(st,dr->st));
}
nod *Delete(int st, int dr)
{
    auto n2 = split(rad,dr);
    auto n = split(n2.first,st-1);
    return join(n.first,n2.second);
}
nod *Access(int k)
{
    auto n2 = split(rad,k);
    auto n = split(n2.first,k-1);
    g<<n.second->val;
    return join(join(n.first,n.second),n2.second);
}
nod *Insert(int poz, int val)
{
    auto p = split(rad,poz-1);
    return join(join(p.first,new nod{&nil,&nil,val,1,rand(),false}),p.second);
}
nod *Reverse(int st, int dr)
{
    auto n2 = split(rad,dr);
    auto n = split(n2.first,st-1);
    n.second->rev^=1;
    n.second = propag(n.second);
    return join(join(n.first,n.second),n2.second);
}
int n,rrr;
int main()
{
    srand(time(NULL));
    f>>n>>rrr;
    for(int i=1;i<=n;i++)
    {
        char ch;
        f>>ch;
        if(ch=='I')
        {
            int poz,val;
            f>>poz>>val;
            rad = Insert(poz,val);
        }
        else if(ch=='A')
        {
            int poz;
            f>>poz;
            rad = Access(poz);
            g<<'\n';
        }
        else if(ch=='R')
        {
            int st,dr;
            f>>st>>dr;
            rad = Reverse(st,dr);
        }
        else if(ch=='D')
        {
            int st, dr;
            f>>st>>dr;
            rad = Delete(st,dr);
        }
    }
    for(int i=1;i<=rad->sz;i++)
    {
        rad = Access(i);
        g<<' ';
    }
    g<<'\n';
    return 0;
}