Cod sursa(job #2641937)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 13 august 2020 09:33:48
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.36 kb
#include <cstdio>
#include <algorithm>
#include <random>
#include <chrono>

using namespace std;

FILE *f = fopen("secv8.in","r");
FILE *g = fopen("secv8.out","w");

struct treap{
    int key,prio;
    treap *l,*r;
    int sz;
    bool rev;
    
    treap(int key,int prio,treap *l,treap *r,int sz,bool rev){
        this->key = key;
        this->prio = prio;
        this->l = l;
        this->r = r;
        this->sz = sz;
        this->rev = rev;
    }

    void propag(){
        l->rev ^= rev;
        r->rev ^= rev;
        if(rev){
            swap(l,r);
            rev = 0;
        }
    }

    void recalc(){
        sz = l->sz + r->sz + 1;
    }
}*root,*nill;



void afis(treap *t){
    if(t == nill)return ;
    t->propag();
    afis(t->l);
    fprintf(g,"%d ",t->key);
    afis(t->r);
}

treap* join(treap *t1,treap *t2){

    if(t1 == nill){
        return t2;
    }
    if(t2 == nill){
        return t1;
    }

    t1->propag();
    t2->propag();

    if(t1->prio >= t2->prio){
        t1->r = join(t1->r,t2);
        t1->recalc();
        return t1;
    }
    else{
        t2->l = join(t1,t2->l);
        t2->recalc();
        return t2;
    }
}

pair<treap*,treap*> split(treap *t,int pos){
    pair<treap*,treap*> ans = {nill,nill};

    if(t == nill){
        return ans;
    }

    t->propag();
    
    if(t->l->sz + 1 <= pos){
        pair<treap*,treap*> tmp = split(t->r,pos - 1 - t->l->sz);
        t->r = tmp.first;
        t->recalc();
        ans.first = t;
        ans.second = tmp.second;
        return ans;
    }
    else{
        pair<treap*,treap*> tmp = split(t->l,pos);
        t->l = tmp.second;
        t->recalc();
        ans.first = tmp.first;
        ans.second = t;
        return ans;
    }
}

treap* insert(treap *t,int pos,treap *elem){
    pair<treap*,treap*> tmp = split(t,pos - 1);
    t = join(tmp.first,elem);
    t = join(t,tmp.second);
    return t;
}

treap* access(treap *t,int pos){
    t->propag();

    if(pos <= t->l->sz){
        return access(t->l,pos);
    }
    else if(pos == t->l->sz + 1){
        return t;
    }
    else{
        return access(t->r,pos - 1 - t->l->sz);
    }
}

treap* rev(treap *t,int l,int r){
    pair<treap*,treap*> tmp = split(t, l - 1);
    pair<treap*,treap*> aux = split(tmp.second, r - l + 1);
    aux.first->rev ^= 1;
    t = join(tmp.first,join(aux.first,aux.second));
    return t;
}

treap* rem(treap *t,int l,int r){
    pair<treap*,treap*> tmp = split(t, l - 1);
    pair<treap*,treap*> aux = split(tmp.second, r - l + 1);
    t = join(tmp.first,aux.second);
    return t;
}

int main(){

    nill = new treap(0,-1,NULL,NULL,0,0);
    root = nill;

    mt19937 gen(chrono::steady_clock::now().time_since_epoch().count());

    int n,t;

    fscanf(f,"%d %d\n",&n,&t);

    for(int i = 1;i <= n;i++){
        char op;
        int j,k;
        fscanf(f,"%c ",&op);

        if(op == 'I'){
            fscanf(f,"%d %d\n",&j,&k);
            treap* tmp = new treap(k,(int)gen(),nill,nill,1,0);
            root = insert(root,j,tmp);
        }
        else if(op == 'A'){
            fscanf(f,"%d\n",&j);
            fprintf(g,"%d\n",access(root,j)->key);
        }
        else if(op == 'R'){
            fscanf(f,"%d %d\n",&j,&k);
            root = rev(root,j,k);
        }
        else{
            fscanf(f,"%d %d\n",&j,&k);
            root = rem(root,j,k);
        }
    }

    afis(root);

    fclose(f);
    fclose(g);

    return 0;
}