Cod sursa(job #2475319)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 16 octombrie 2019 19:29:50
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.25 kb
#include <cstdio>
#include <stdlib.h>
#include <time.h>
#define INF 2000000000
using namespace std;
struct treap{
    int key;
    int pri;
    int revers;
    int nodes;
    treap *st , *dr;

    treap (int key,int pri,treap *st,treap *dr,int revers,int nodes){
        this->key=key;
        this->pri=pri;
        this->st=st;
        this->dr=dr;
        this->revers = revers;
        this->nodes = nodes;
    }


};
treap *r , *nil,*rl,*rr,*ruseless,*rmid;

void update (treap *&n){ /// update valorilor din n
    n->nodes = n->st->nodes + 1 + n->dr->nodes;
}

void update_reverse (treap *&n){
    if (n->revers){
        n->st->revers = 1 - n->st->revers;
        n->dr->revers = 1 - n->dr->revers;
        n->revers = 0;
        treap *aux = n->st;
        n->st = n->dr;
        n->dr = aux;
    }
}

void left (treap *&n){
    treap *y = n->st;

    n->st = y->dr;
    y->dr=n;
    n=y;
    update (n->dr);
    update (n);
}
void right (treap *&n){
    treap *y = n->dr;

    n->dr = y->st;
    y->st=n;
    n=y;
    update (n->st);
    update (n);
}


void balance (treap*&n){
    if (n->pri < n->st->pri) /// rotire stanga
        left (n);

    else if (n->pri < n->dr->pri) /// rotire dreapta
        right(n);
}

void inser (treap *&n , int val , int poz , int pri){

    //if (poz == 3)
      //  printf ("%d ",pri);
    if (n == nil){
        n = new treap(val,pri,nil,nil,0,1);
    }
    else {
        update_reverse(n);

        if (n->st->nodes + 1 < poz) /// e in dreapta
            inser (n->dr,val,poz - 1 - n->st->nodes,pri);
        else
            inser(n->st,val,poz,pri);

        balance(n);
        update(n);
    }

}

void delet (treap *&n , int key){

    if (n ->st == nil && n->dr == nil){
        if (n->key == key){
            delete n;
            n = nil;
        }
    }
    else {
        update_reverse(n);
        if (n->st->pri > n->dr->pri){
            update_reverse(n->st);
            left(n);
            delet (n->dr,key);
        }
        else {
            update_reverse(n->dr);
            right(n);
            delet(n->st , key);
        }
    }
    if (n!=nil)
        update(n);

}

int cauta (treap *&r , int poz){
    update_reverse(r);
    //update(r);
    if (r->st->nodes + 1 == poz){
        return r->key;
    }
    else{
        if (r->st->nodes + 1 < poz)
            return cauta (r->dr , poz - 1 - r->st->nodes);
        return cauta (r->st , poz);
    }

}

void split (treap *&r , treap *&rs , treap *&rd , int key){

    inser(r,INF,key,INF);
    rs = r->st;
    rd = r->dr;
    delete r;

}

void join (treap *&r , treap*&rs , treap*&rd){

    r = new treap ( -1 , INF , rs , rd , 0 , rs->nodes + rd->nodes );
    delet (r , -1);

}

int main()
{
    FILE *fin = fopen ("secv8.in","r");
    FILE *fout = fopen ("secv8.out","w");
    int q,ok,x,y;
    char c;

    //srand(time(0));

    r = nil = new treap (0,0,NULL,NULL,0,0);

    int elem = 0;

    fscanf (fin,"%d%d\n",&q,&ok);
    for (;q;q--){
        c=fgetc(fin);
        if (c == 'I'){
            fscanf (fin,"%d%d\n",&y,&x);
            elem++;
            /// insert elem x poz y
            inser (r,x,y,rand()%INF+1);
        }
        else if (c == 'A'){
            fscanf (fin,"%d\n",&x);
            /// access elem poz x
            fprintf (fout,"%d\n",cauta (r,x));

            //for (int i=1;i<=elem;i++)
              //  printf ("%d ",cauta (r,i));


        }
        else if (c == 'R'){
            fscanf (fin,"%d%d\n",&x,&y);
            /// reverse x .. y
            split (r , rmid , rr , y+1);
            split (rmid , rl , ruseless , x);
            ruseless->revers = 1;
            join (rmid,rl,ruseless);
            join (r,rmid,rr);
        }
        else{
            fscanf (fin,"%d%d\n",&x,&y);
            /// delete x .. y
            split (r , rmid , rr , y+1);
            split (rmid , rl , ruseless , x);
            join (r,rl,rr);
            elem = elem - (y - x + 1);
            //for (int i=1;i<=elem;i++)
              //  printf ("%d ",cauta (r,i));
        }
    }
    for (int i = 1 ; i <= elem ; i ++)
        fprintf (fout,"%d ",cauta(r,i));
    return 0;
}