Cod sursa(job #2189679)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 28 martie 2018 20:21:23
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.2 kb
#include <bits/stdc++.h>

#define INF 2140000000
#define MOD 1000000007
#define MaxN 100005

using namespace std;

FILE *IN=fopen("secv8.in","r"),*OUT=fopen("secv8.out","w");

int N,junk,X,Y;
char type;

struct Node
{
    int val,pri,rev,w;
    Node *left,*right;
    Node(Node *T=NULL,int v=-1)
    {
        rev=0;
        w=(T!=NULL);
        left=right=T;
        val=v;
        pri=rand();
    }
}*Root,*NIL;
typedef Node *Treap;
typedef pair<Treap,Treap> Pair;

void UnReverse(Treap &T)
{
    if(T->rev)
    {
        T->rev=0;
        swap(T->left,T->right);
        T->left->rev^=1;
        T->right->rev^=1;
    }
}
void Recalculate(Treap &T)
{
    T->w=1+T->left->w+T->right->w;
}
Treap join(Treap T1,Treap T2)
{
    if(T1==NIL)
        return T2;
    if(T2==NIL)
        return T1;
    UnReverse(T1);
    UnReverse(T2);
    if(T1->pri>T2->pri)
    {
        T1->right=join(T1->right,T2);
        Recalculate(T1);
        return T1;
    }
    else
    {
        T2->left=join(T1,T2->left);
        Recalculate(T2);
        return T2;
    }
}
Pair split(Treap T,int g)
{
    if(T==NIL)
        return {NIL,NIL};
    UnReverse(T);
    if(T->left->w+1==g)
    {
        Pair Temp={T->left,T};
        T->left=NIL;
        Recalculate(T);
        return Temp;
    }
    else if(T->left->w>=g)
    {
        Pair Temp=split(T->left,g);
        T->left=Temp.second;
        Recalculate(T);
        return {Temp.first,T};
    }
    else
    {
        Pair Temp=split(T->right,g-1-T->left->w);
        T->right=Temp.first;
        Recalculate(T);
        return {T,Temp.second};
    }
}
void Insert(Treap &T,int val,int key)
{
    Treap Add=new Node(NIL,val);
    Pair Temp=split(T,key);
    T=join(Temp.first,join(Add,Temp.second));
}
void Delete(Treap &T,int key1,int key2)
{
    Pair Temp=split(T,key1);
    Pair Temp2=split(Temp.second,key2-key1+2);
    T=join(Temp.first,Temp2.second);
}
int Access(Treap T,int key)
{
    UnReverse(T);
    if(T->left->w>=key)
        return Access(T->left,key);
    else if(T->left->w+1==key)
        return T->val;
    else return Access(T->right,key-1-T->left->w);
}
void Reverse(Treap &T,int key1,int key2)
{
    Pair Temp=split(T,key1);
    Pair Temp2=split(Temp.second,key2-key1+2);
    Temp2.first->rev^=1;
    T=join(Temp.first,join(Temp2.first,Temp2.second));
}
void Print(Treap T)
{
    if(T==NIL)
        return;
    UnReverse(T);
    Print(T->left);
    fprintf(OUT,"%d ",T->val);
    Print(T->right);
}
int main()
{
    srand(time(NULL));
    NIL=new Node();
    Root=NIL;

    fscanf(IN,"%d%d",&N,&junk);

    for(int i=1;i<=N;i++)
    {
        fscanf(IN," %c",&type);
        if(type=='I')
        {
            fscanf(IN,"%d%d",&X,&Y);
            Insert(Root,Y,X);
        }
        else if(type=='A')
        {
            fscanf(IN,"%d",&X);
            fprintf(OUT,"%d\n",Access(Root,X));
        }
        else if(type=='R')
        {
            fscanf(IN,"%d%d",&X,&Y);
            Reverse(Root,X,Y);
        }
        else
        {
            fscanf(IN,"%d%d",&X,&Y);
            Delete(Root,X,Y);
        }
    }
    Print(Root);

    return 0;
}