Cod sursa(job #1526007)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 15 noiembrie 2015 20:02:44
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.09 kb
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct treap{
    int priority;
    int size;
    int value;
    bool reversed;
    treap *left;
    treap *right;
    treap(int _value=0){
        reversed=false;
        priority=rand();
        size=1;
        value=_value;
        left=right=NULL;
    }
};
treap* root;
treap* nil;
int get_size(treap *node){
    if(node==NULL)
        return 0;
    return node->size;
}
void update(treap *node){
    if(node!=NULL)
        node->size=1+get_size(node->left)+get_size(node->right);
}
void reverse_node(treap *node){
    if(node==NULL)
        return;
    node->reversed^=1;
}
void propagate(treap *&node){
    treap* answer;
    if(node==NULL||node->reversed==false)
        return;
    node->reversed=false;
    swap(node->left,node->right);
    reverse_node(node->left);
    reverse_node(node->right);
}
void split(treap *node,int size,treap *&left,treap *&right){
    propagate(node);
    if(node==NULL){
        left=right=NULL;
        return;
    }
    if(get_size(node->left)<size){
        split(node->right,size-get_size(node->left)-1,node->right,right);
        left=node;
    }
    else{
        split(node->left,size,left,node->left);
        right=node;
    }
    update(node);
}
void join(treap *&answer,treap *first,treap *second){
    if(first==NULL){
        answer=second;
        return;
    }
    if(second==NULL){
        answer=first;
        return;
    }
    propagate(first);
    propagate(second);
    if(second->priority<first->priority){
        join(first->right,first->right,second);
        answer=first;
    }
    else{
        join(second->left,first,second->left);
        answer=second;
    }
    propagate(answer);
    update(answer);
}
void insert(treap *&node,treap *add,int index){
    propagate(node);
    if(node==NULL){
        node=add;
        return;
    }
    if(node->priority<add->priority){
        split(node,index,add->left,add->right);
        node=add;
    }
    else
        if(get_size(node->left)<index)
            insert(node->right,add,index-get_size(node->left)-1);
        else
            insert(node->left,add,index);
    update(node);
}
void erase(int first,int second){
    treap *treap1=new treap,*treap2=new treap,*treap3=new treap,*temp=new treap;
    split(root,first-1,treap1,temp);
    split(temp,second-first+1,treap2,treap3);
    join(root,treap1,treap3);
}
int find(treap* node,int index){
    propagate(node);
    if(node==NULL)
        return -1;
    if(index==get_size(node->left)+1)
        return node->value;
    if(index<get_size(node->left)+1)
        return find(node->left,index);
    else
        return find(node->right,index-get_size(node->left)-1);
}
void reverse(int first,int second){
    treap *treap1=new treap,*treap2=new treap,*treap3=new treap,*temp=new treap;
    split(root,first-1,treap1,temp);
    split(temp,second-first+1,treap2,treap3);
    reverse_node(treap2);
    join(temp,treap1,treap2);
    join(root,temp,treap3);
}
void dump(treap* node){
    propagate(node);
    if(node!=NULL){
        dump(node->left);
        printf("%d ",node->value);
        dump(node->right);
    }
}
int main(){
    freopen("secv8.in","r",stdin);
    freopen("secv8.out","w",stdout);
    int operations,is_reversed,i,index,value,first,second;
    srand(time(0));
    nil=new treap;
    root=NULL;
    char operation;
    scanf("%d%d\n",&operations,&is_reversed);
    for(i=1;i<=operations;i++){
        scanf("%c",&operation);
        if(operation=='I'){
            scanf("%d%d\n",&index,&value);
            insert(root,new treap(value),index-1);
        }
        if(operation=='A'){
            scanf("%d\n",&index);
            printf("%d\n",find(root,index));
        }
        if(operation=='R'){
            scanf("%d%d\n",&first,&second);
            reverse(first,second);
        }
        if(operation=='D'){
            scanf("%d%d\n",&first,&second);
            erase(first,second);
        }
    }
    dump(root);
    return 0;
}