Cod sursa(job #1399653)

Utilizator danalex97Dan H Alexandru danalex97 Data 24 martie 2015 20:56:34
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.67 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;

ifstream F("secv8.in");
ofstream G("secv8.out");

struct item {
    int pr,sz,vl;
    bool rev;
    item *l,*r;

    item()
    {
    }

    item(int vv)
    {
        vl = vv;
        pr = (rand() << 6) ^ rand();
        sz = 1;
        l = r = NULL;
        rev = 0;
    }
};

#define tree item*

void upd(tree &t)
{
    if ( !t ) return;
    t->sz = 1 + ( t->l ? t->l->sz : 0 ) + ( t->r ? t->r->sz : 0 );
}

void check(tree &t)
{
    if ( !t ) return;
    if ( t->rev )
    {
        t->rev ^= 1;
        swap(t->l,t->r);
        if ( t->l ) t->l->rev ^= 1;
        if ( t->r ) t->r->rev ^= 1;
    }
}

void split(tree t,int pl,tree &l,tree &r)
{
    if ( !t )
        return void(l = r = NULL);
    check(t);
    int sz = t->l ? t->l->sz : 0;
    if ( pl <= sz )
        split(t->l,pl,l,t->l) , r = t;
    else
        split(t->r,pl-sz-1,t->r,r) , l = t;
    upd(t);
}

void insert(tree &t,int pl,tree x)
{
    if ( !t )
        return void(t = x);
    check(t);
    int sz = t->l ? t->l->sz : 0;
    if ( t->pr > x->pr ) // min pri
        split(t,pl,x->l,x->r) , t = x;
    else
    {
        if ( pl <= sz )
            insert(t->l,pl,x);
        else
            insert(t->r,pl-sz-1,x);
    }
    upd(t);
}

void merge(tree &t,tree l,tree r)
{
    check(l);
    check(r);
    if ( !l || !r )
        return void( t = l ? l : r ); //
    if ( l->pr < r->pr )
        merge(l->r,l->r,r) , t = l;
    else
        merge(r->l,l,r->l) , t = r;
    upd(t);
}

void erase(tree &t,int pl)
{
    check(t);
    int sz = t->l ? t->l->sz : 0;
    if ( sz + 1 == pl )
        merge(t,t->l,t->r);
    else
        if ( pl <= sz )
            erase(t->l,pl);
        else
            erase(t->r,pl-sz-1);
    upd(t);
}

int acces(tree t,int pl)
{
    check(t);
    int sz = t->l ? t->l->sz : 0;
    if ( sz + 1 == pl )
        return t->vl;
    else
        if ( pl <= sz )
            return acces(t->l,pl);
        else
            return acces(t->r,pl-sz-1);
}

void print(tree t)
{
    check(t);
    if ( t->l ) print(t->l);
    G<<t->vl<<' ';
    if ( t->r ) print(t->r);
}

void printd(tree t)
{
    if ( !t ) return;
    check(t);
    if ( t->l ) printd(t->l);
    cerr<<t->vl<<' ';
    if ( t->r ) printd(t->r);
}

int n,m;
char ch;

tree t = NULL;

int main()
{
    srand(time(0));
    F>>n>>m;
    for (int i=1,p,vl,p1,p2;i<=n;++i)
    {
        F>>ch;
        if ( ch == 'I' )
        {
            F>>p>>vl;
            tree x = new item(vl);
            insert(t,p-1,x);
        }
        if ( ch == 'A' )
        {
            F>>p;
            G<<acces(t,p)<<'\n'; // -1
        }
        if ( ch == 'R' )
        {
            F>>p1>>p2;
            tree l = new item();
            tree m = new item();
            tree r = new item();
            split(t,p1-1,l,m);

            //cerr<<"L "; printd(l);cerr<<'\n';
            //cerr<<"MR "; printd(m);cerr<<'\n';

            split(m,p2-p1+1,m,r);

            //cerr<<"L "; printd(l);cerr<<'\n';
            //cerr<<"M "; printd(m);cerr<<'\n';
            //cerr<<"R "; printd(r);cerr<<'\n';

            //printd(m); cerr<<'\n';
            m->rev ^= 1;
            merge(t,l,m);
            //printd(t); cerr<<'\n';
            merge(m,t,r);
            t = m;
            //printd(t); cerr<<'\n';
        }
        if ( ch == 'D' )
        {
            F>>p1>>p2;
            for (;p2 >= p1;p2--)
                erase(t,p1);
        }
        //printd(t); cerr<<'\n';
    }
    print(t); G<<'\n';
}