Cod sursa(job #2504347)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 4 decembrie 2019 20:41:24
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.04 kb
//I <3 treaps
//jk
#include<fstream>
#include<time.h>
#include<stdlib.h>

using namespace std;

ifstream fi("secv8.in");
ofstream fo("secv8.out");

class node
{
    public:
        node *st,*dr;
        int val,pri,sz;
        bool rev;

        node(node *x, node *y, int a, int b)
        {
            st=x;
            dr=y;
            val=a;
            pri=b;
            sz=1;
            rev=0;
        }
};

node *rad;

void compute(node *&nod)
{
    if(nod->rev)
        swap(nod->st,nod->dr);

    nod->sz=1;
    if(nod->st!=NULL)
    {
        nod->st->rev^=nod->rev;
        nod->sz+=nod->st->sz;
    }
    if(nod->dr!=NULL)
    {
        nod->dr->rev^=nod->rev;
        nod->sz+=nod->dr->sz;
    }

    nod->rev=0;
}

void toRight(node *&nod)
{
    node *aux=nod->st;

    compute(nod);
    compute(aux);

    nod->st=aux->dr;
    aux->dr=nod;

    compute(nod);
    compute(aux);

    nod=aux;
}

void toLeft(node *&nod)
{
    node *aux=nod->dr;

    compute(nod);
    compute(aux);

    nod->dr=aux->st;
    aux->st=nod;

    compute(nod);
    compute(aux);

    nod=aux;
}

void balance(node *&nod)
{
    if(nod->st!=NULL && (nod->st->pri)>(nod->pri))
        toRight(nod);
    if(nod->dr!=NULL && (nod->dr->pri)>(nod->pri))
        toLeft(nod);
}

void ins(node *&nod, int poz, int val, int pri)
{
    if(nod==NULL)
    {
        nod=new node(NULL,NULL,val,pri);
        return;
    }

    compute(nod);

    if(poz<=((nod->st!=NULL)?(nod->st->sz):0))
        ins(nod->st,poz,val,pri);
    else
        ins(nod->dr,poz-((nod->st!=NULL)?(nod->st->sz):0)-1,val,pri);

    compute(nod);
    balance(nod);
}


int del(node *&nod)
{
    compute(nod);

    if(nod->st==NULL && nod->dr==NULL)
    {
        delete(nod);
        return 2;
    }

    if(nod->dr==NULL || (nod->st!=NULL && (nod->st->pri)>(nod->dr->pri)))
    {
        toRight(nod);

        int aux=del(nod->dr);

        if(aux==2)
            nod->dr=NULL;

        compute(nod);
        return (aux!=0);
    }
    else
    {
        toLeft(nod);

        int aux=del(nod->st);

        if(aux==2)
            nod->st=NULL;

        compute(nod);
        return (aux!=0);
    }
}


int src(node *nod, int poz)
{
    compute(nod);

    if(poz<((nod->st!=NULL)?(nod->st->sz):0))
        return src(nod->st,poz);
    else if(poz==((nod->st!=NULL)?(nod->st->sz):0))
        return nod->val;
    else
        return src(nod->dr,poz-((nod->st!=NULL)?(nod->st->sz):0)-1);
}

void rev(int x, int y)
{
    compute(rad);

    ins(rad,x-1,0,1000000000);
    node *Ts=rad->st;
    ins(rad->dr,y-x+1,0,1000000000);
    node *T=rad->dr->st;
    node *Td=rad->dr->dr;

    T->rev^=1;

    delete(rad->dr);
    delete(rad);

    rad=new node(Ts,T,0,1000000000);
    del(rad);

    rad=new node(rad,Td,0,1000000000);
    del(rad);
}

void ers(int x, int y)
{
    ins(rad,x-1,0,1000000000);
    node *Ts=rad->st;
    ins(rad->dr,y-x+1,0,1000000000);
    node *Td=rad->dr->dr;

    delete(rad->dr);
    delete(rad);

    rad=new node(Ts,Td,0,1000000000);
    del(rad);
}

void print(node *&nod)
{
    compute(nod);

    if(nod->st!=NULL)
        print(nod->st);
    fo<<nod->val<<" ";
    if(nod->dr)
        print(nod->dr);
}

int main()
{
    rad=NULL;

    int n,trash;
    fi>>n>>trash;

    srand(time(NULL));

    int val=0;
    for(int i=1; i<=n; i++)
    {
        char c;
        fi>>c;

        if(c=='I')
        {
            int x,y;
            fi>>x>>y;
            ins(rad,x-1,y,++val); //modifica
        }
        else if(c=='A')
        {
            int x;
            fi>>x;
            fo<<src(rad,x-1)<<"\n";
        }
        else if(c=='R')
        {
            int x,y;
            fi>>x>>y;
            rev(x,y);
        }
        else
        {
            int x,y;
            fi>>x>>y;
            ers(x,y);
        }
    }

    print(rad);
    fi.close();
    fo.close();
    return 0;
}