Cod sursa(job #893407)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 26 februarie 2013 15:32:07
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.76 kb
#include <fstream>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

ifstream fin("secv8.in");
ofstream fout("secv8.out");

const int inf= 1<<30;
int cq;

struct tn{
    int left, right;
    int dim, val, pr, rev;
    tn(){
        left= 0; right= 0;
        val= 0; pr= 0; dim= 0; rev= 0;
    }
};
vector <tn> tr;
int root, tn1, tn2, tn3;

inline void tr_dim(int x){
    tr[x].dim= tr[tr[x].left].dim+tr[tr[x].right].dim+1;
}

void tr_rev(int x){
    if (x==0){
        return;
    }else if (tr[x].rev==1){
        tr[x].rev= 0;
        int aux= tr[x].left; tr[x].left= tr[x].right; tr[x].right= aux;
        tr[tr[x].left].rev^= 1; tr[tr[x].right].rev^= 1;
    }
}

void tr_write(int x){
    if (x==0){
        return;
    }else{
        tr_rev(x);
        //printf("l ");
        tr_write(tr[x].left);
        //printf("u ");
        //printf("%d ", tr[x].val);
        fout<<tr[x].val<<" ";
        //printf("r ");
        tr_write(tr[x].right);
        //printf("u ");
        
    }
}

int tr_rleft(int x){
    //printf("%d %d %d\n", tr[x].left, x, tr[x].right);
    int aux= tr[x].left;
    tr_rev(aux);
    tr[x].left= tr[aux].right; tr_dim(x);
    tr[aux].right= x; tr_dim(aux);
    return aux; 
}

int tr_rright(int x){
    //printf("%d %d %d\n", tr[x].left, x, tr[x].right);
    int aux= tr[x].right;
    tr_rev(aux);
    tr[x].right= tr[aux].left; tr_dim(x);
    tr[aux].left= x; tr_dim(aux);
    return aux;
}

int tr_balance(int x){
    //printf("%d %d %d\n", tr[x].left, x, tr[x].right);
    if (tr[x].pr<tr[tr[x].left].pr){
        return tr_rleft(x);
    }
    if (tr[x].pr<tr[tr[x].right].pr){
        return tr_rright(x);
    }
    return x;
}

int tr_ins(int x, int pos, int val, int pr){
    /*if (cq==4){
        printf("%d\n", x);
    }*/
    if (x==0){
        //printf("*\n");
        x= tr.size();
        tr.push_back(tn());
        tr[x].val= val; tr[x].pr= pr; tr[x].dim= 1;  
    }else{
        tr_rev(x);
        if (pos<=tr[tr[x].left].dim+1){
            //printf("l\n");
            int aux= tr_ins(tr[x].left, pos, val, pr); 
            tr[x].left= aux;
        }else{
            //printf("r\n");
            int aux= tr_ins(tr[x].right, pos-tr[tr[x].left].dim-1, val, pr);
            tr[x].right= aux;
        }
        x= tr_balance(x);
        tr_dim(x);
    }
    return x;
}

int tr_que(int x, int pos){
    tr_rev(x);
    if (pos==tr[tr[x].left].dim+1){
        return tr[x].val;
    }else if (pos<=tr[tr[x].left].dim){
        return tr_que(tr[x].left, pos);
    }else{
        return tr_que(tr[x].right, pos-tr[tr[x].left].dim-1);
    }
}

void tr_spl(int x, int y){
    root= tr_ins(root, x, 0, inf);
    //tr_write(root); printf("\n");
    tn1= tr[root].left; root= tr[root].right;
    //tr_write(tn1); printf("\n");
    root= tr_ins(root, y-x+2, 0, inf);
    //tr_write(root); printf("\n");
    tn2= tr[root].left; tn3= tr[root].right;
    //tr_write(tn2); printf("\n"); tr_write(tn3); printf("\n");
}

int tr_erase(int x){
    //printf("%d %d %d\n", tr[x].left, x, tr[x].right);
    tr_rev(x);
    if (tr[x].left==0&& tr[x].right==0){
        //printf("- %d -\n", x);
        return 0;
    }else if (tr[tr[x].left].pr>tr[tr[x].right].pr){
        x= tr_rleft(x); 
        tr[x].right= tr_erase(tr[x].right);
        //printf("%d %d %d\n", tr[x].left, x, tr[x].right);
    }else{
        x= tr_rright(x);
        tr[x].left= tr_erase(tr[x].left);
        //printf("%d %d %d \n", tr[x].left, x, tr[x].right);
    }
    tr_dim(x);
    //printf("%d %d %d\n", tr[x].left, x, tr[x].right);
    return x;
}

int tr_join(int x, int y){
    int aux= tr.size(); 
    tr.push_back(tn());
    tr[aux].left= x; tr[aux].right= y;
    //tr_write(aux); printf("\n");
    aux= tr_erase(aux);
    //printf("%d\n", aux);
    //tr_write(aux); printf("\n");
    return aux;
}

//int v[7]={0, 1, 2, 2, 0, 4, 3};

int main(){
    int nq, ifr;
    fin>>nq>>ifr;

    tr.push_back(tn());
    root= 0;
    srand(time(0));
    for (cq= 1; cq<=nq; ++cq){
        char op;
        fin>>op;
        //printf("%c\n", op);
        if (op=='I'){
            int x, y;
            fin>>x>>y;
            root= tr_ins(root, x, y, rand()%(inf-1));
        }else if (op=='A'){
            int x;
            fin>>x;
            fout<<tr_que(root, x)<<"\n";
        }else if (op=='R'){
            int x, y;
            fin>>x>>y;
            tr_spl(x, y); 
            tr[tn2].rev= 1;
            //tr_write(tn1); printf("/"); tr_write(tn2); printf("/"); tr_write(tn3); printf("\n");
            root= tr_join(tn1, tn2); 
            //tr_write(root); printf("\n");
            root= tr_join(root, tn3);
        }else{
            int x, y;
            fin>>x>>y;
            tr_spl(x, y);
            root= tr_join(tn1, tn3);
        }
        //tr_write(root); printf("\n");
    }
    tr_write(root); printf("\n");

    return 0;
}