Cod sursa(job #1291966)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 decembrie 2014 15:34:47
Problema Secv8 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.68 kb
#include <fstream>
#include <algorithm>
#include <cstdlib>
#include <ctime>

using namespace std;

class treap {
public:
    int value;
    int priority;
    int din;

    treap *left,*right;
    bool lazy;

    treap(int value=0,int priority=0,int din=0,treap *left=NULL, treap *right=NULL, bool lazy=false): value(value), priority(priority), din(din), left(left), right(right), lazy(lazy) {}

    ~treap(){
        if(this->left!=this){
            delete left;
            delete right;
        }
    }
}*rad,*nil;

inline void fii_lenesi(treap* &t) {
    if(t==nil)
        return;

    if(t->lazy){
        t->left->lazy^=1;
        t->right->lazy^=1;

        swap(t->left,t->right);

        t->lazy=0;
    }
}

inline void calc_din(treap* &t) {
    if(t!=nil)
        t->din=1+t->left->din+t->right->din;
}

inline void rot_right(treap* &x) {
    fii_lenesi(x);

    treap *y=x->left;
    fii_lenesi(y);

    x->left=y->right;
    y->right=x;
    x=y;
}

inline void rot_left(treap* &y) {
    fii_lenesi(y);

    treap *x=y->right;
    fii_lenesi(x);

    y->right=x->left;
    x->left=y;
    y=x;
}

inline void balance(treap* &t) {
    if(t->priority<t->left->priority){
        rot_right(t);
        calc_din(t->right);
    }
    else if(t->priority<t->right->priority){
        rot_left(t);
        calc_din(t->left);
    }

    calc_din(t);
}

void insert(treap* &t,int s,int val,int pr) {
    if(t==nil){
        t=new treap(s,pr,1,nil,nil);
        return;
    }
    fii_lenesi(t);

    if(val==1)
        insert(t->left,s,val,pr);
    else if(val<=t->left->din+1)
        insert(t->left,s,val,pr);
    else
        insert(t->right,s,val-t->left->din-1,pr);
    balance(t);
}

void coboara(treap* &t) {

    //cout<<"coboara "<<t->priority<<endl;
    if(t==nil)
        return;

    if(t->left==nil && t->right==nil){
        delete t;
        t=nil;
        return;
    }

    fii_lenesi(t);

    if(t->priority<t->left->priority && t->priority<t->right->priority){
        if(t->left->priority<t->right->priority){
            rot_left(t);
            coboara(t->left);
        }
        else{
            rot_right(t);
            coboara(t->right);
        }
    }
    else if(t->priority<t->left->priority){
        rot_right(t);
        coboara(t->right);
    }
    else if(t->priority<t->right->priority){
        rot_left(t);
        coboara(t->left);
    }

    calc_din(t);
}

int access(treap* &t, int val) {
    fii_lenesi(t);

    if(val<=t->left->din)
        return access(t->left,val);
    else if(val==t->left->din+1)
        return t->value;
    else
        return access(t->right,val-t->left->din-1);
}
/*
void parc(treap* &t) {
    if(t==nil){
       // cout<<"GOL\n";
        return;
    }

   // cout<<"cobor st"<<endl;
    parc(t->left);
  //  cout<<"urc"<<endl;
    cout<<t->value<<endl;
  //  cout<<"cobor dr"<<endl;
    parc(t->right);
 //   cout<<"urc"<<endl;
}*/

void del(int st, int dr) {
    insert(rad,-1,st,60001);
    insert(rad,-2,dr+2,60000);


    delete rad->right->left;
    rad->right->left=nil;

    rad->right->priority=-1;
    coboara(rad->right);

    rad->priority=-1;
    coboara(rad);
}

void rev(int st,int dr) {
    insert(rad,-1,st,60001);
    insert(rad,-2,dr+2,60000);


    rad->right->left->lazy=1;

    rad->right->priority=-1;

    //cout<<"aici "<<nil->priority<<endl;

    coboara(rad->right);
//cout<<"aici "<<nil->priority<<endl;

    rad->priority=-1;

//cout<<"aici "<<nil->priority<<endl;


    coboara(rad);

//cout<<"aici "<<nil->priority<<endl;

  //  parc(rad);

//cout<<"aici "<<nil->priority<<endl;

}

int main()
{
    ifstream cin("secv8.in");
    ofstream cout("secv8.out");

    int n;
    bool aux;

    cin>>n>>aux;

    char tip;
    int k,e,i,j;

    cin>>tip>>k>>e;

    //srand(25);

    nil=new treap(0,0,0);
    nil->left=nil;
    nil->right=nil;

    rad=new treap(e,rand()%30000+1,1,nil,nil);

    n--;

    int sz=1;
    while(n--){
        cin>>tip;
        if(tip=='I'){
            cin>>k>>e;
            insert(rad,e,k,rand()%30000+1);

            sz++;
        }
        else if(tip=='A'){
            cin>>k;
            cout<<access(rad,k)<<'\n';
        }
        else if(tip=='R'){
            cin>>i>>j;

            rev(i,j);
        }
        else{
            cin>>i>>j;
            del(i,j);
            sz-=(j-i+1);
        }
    }

    if(sz){
        cout<<access(rad,1);
        for(int i=2;i<=sz;i++)
            cout<<' '<<access(rad,i);
    }
    cout<<'\n';

    cin.close();
    cout.close();
    return 0;
}