Cod sursa(job #1694428)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 25 aprilie 2016 13:48:13
Problema Secv8 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.25 kb
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
class Hash{
    public:
        int r1,r2;
};
class Treap{
    public:
        int size;
        int val;
        int key;
        bool rev;
        Treap* left;
        Treap* right;
        Treap(int _size=0,int _val=0,int _key=0,bool _rev=0,Treap* _left=0,Treap* _right=0){
            size=_size;
            val=_val;
            key=_key;
            rev=_rev;
            left=_left;
            right=_right;
        }
};
Treap *nil=new Treap;
Treap *T=nil;
int q_val;
int my_rand(){
    return rand()*rand()+rand();
}
Treap* same(Treap* node){
    Treap* res=new Treap;
    if(!node)
        return NULL;
    res->size=node->size;
    res->val=node->val;
    res->key=node->key;
    res->rev=node->rev;
    res->left=node->left;
    res->right=node->right;
    return res;
}
void update(Treap* node){
    if(node==nil)
        return;
    if(node->rev){
        node->left->rev^=1;
        node->right->rev^=1;
        node->rev=false;
        swap(node->left,node->right);
    }
    node->size=node->left->size+1+node->right->size;
}
int get_size(Treap* node){
    if(!node)
        return 0;
    return node->size;
}
pair<Treap*,Treap*>split(Treap* node,int size1){
    pair<Treap*,Treap*>res;
    res.first=new Treap;
    res.second=new Treap;
    update(node);
    if(node==nil){
        res.first=nil;
        res.second=nil;
        return res;
    }
    if(get_size(node->left)+1<=size1){
        pair<Treap*,Treap*> split_t=split(node->right,size1-get_size(node->left)-1);
        node->right=split_t.first;
        split_t.first=node;
        update(node);
        return split_t;
    }
    else{
        pair<Treap*,Treap*> split_t=split(node->left,size1);
        node->left=split_t.second;
        split_t.second=node;
        update(node);
        return split_t;
    }
}
Treap* join(Treap* node1,Treap* node2){
    Treap* res=new Treap;
    if(node1==nil)
        return node2;
    if(node2==nil)
        return node1;
    update(node1);
    update(node2);
    if(node1->key>node2->key){
        res=same(node1);
        res->right=join(node1->right,node2);
    }
    else{
        res=same(node2);
        res->left=join(node1,node2->left);
    }
    update(res);
    return res;
}
Treap* insert(Treap* node,int val,int pos){
    pair<Treap*,Treap*> split_t=split(node,pos);
    Treap *cen=new Treap(1,val,my_rand(),false,nil,nil);
    return join(split_t.first,join(cen,split_t.second));
}
Treap* erase(Treap* node,int l,int r){
    pair<Treap*,Treap*>split_t1=split(node,l-1);
    pair<Treap*,Treap*>split_t2=split(split_t1.second,r-l+1);
    Treap* res=join(split_t1.first,split_t2.second);
    return res;
}
Treap* reverse(Treap* node,int l,int r){
    Treap* res=new Treap;
    update(node);
    pair<Treap*,Treap*>split_t1=split(node,l-1);
    pair<Treap*,Treap*>split_t2=split(split_t1.second,r-l+1);
    split_t2.first->rev^=1;
    res=join(split_t2.first,split_t2.second);
    res=join(split_t1.first,res);
    return res;
}
Treap* query(Treap* node,int pos){
    update(node);
    pair<Treap*,Treap*>split_t1=split(node,pos);
    pair<Treap*,Treap*>split_t2=split(split_t1.second,1);
    q_val=split_t2.first->val;
    return join(split_t1.first,join(split_t2.first,split_t2.second));
}
void print(Treap* node){
    if(node==nil)
        return;
    print(node->left);
    printf("%d ",node->val);
    print(node->right);
}
int main(){
    freopen("secv8.in","r",stdin);
    freopen("secv8.out","w",stdout);
    int nrq,t;
    scanf("%d%d\n",&nrq,&t);
    while(nrq--){
        char c;
        scanf("%c",&c);
        if(c=='I'){
            int pos,val;
            scanf("%d%d\n",&pos,&val);
            T=insert(T,val,pos-1);
        }
        else if(c=='A'){
            int pos;
            scanf("%d\n",&pos);
            T=query(T,pos-1);
            printf("%d\n",q_val);
        }
        else if(c=='R'){
            int l,r;
            scanf("%d%d\n",&l,&r);
            T=reverse(T,l,r);
        }
        else{
            int l,r;
            scanf("%d%d\n",&l,&r);
            T=erase(T,l,r);
        }
    }
    print(T);
    return 0;
}