Cod sursa(job #2701178)

Utilizator Savu_Stefan_CatalinSavu Stefan Catalin Savu_Stefan_Catalin Data 30 ianuarie 2021 07:36:26
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("secv8.in");
ofstream out("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);
    out<<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));
    in>>n>>rrr;
    for(int i=1; i<=n; i++)
    {
        char c;
        in>>c;
        if(c=='I')
        {
            int poz,val;
            in>>poz>>val;
            rad = Insert(poz,val);
        }
        else if(c=='A')
        {
            int poz;
            in>>poz;
            rad = Access(poz);
            out<<'\n';
        }
        else if(c=='R')
        {
            int st,dr;
            in>>st>>dr;
            rad = Reverse(st,dr);
        }
        else if(c=='D')
        {
            int st, dr;
            in>>st>>dr;
            rad = Delete(st,dr);
        }
    }
    for(int i=1; i<=rad->sz; i++)
    {
        rad = Access(i);
        out<<' ';
    }
    out<<'\n';
    return 0;
}