Cod sursa(job #2879659)

Utilizator Ioana_GaborGabor Ioana Ioana_Gabor Data 28 martie 2022 20:30:58
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fi("secv8.in");
ofstream fo("secv8.out");

mt19937 rng(time(0));

struct nod{
    nod *l,*r;
    bool rev;
    int val;
    int priorit;
    int we;
    nod(int x): rev(0),val(x),priorit(rand()),we(1),l(NULL),r(NULL){}
    void update();
};

nod *root=NULL;

int wei(nod* t){
    if(t){
        return t->we;
    }
    return 0;
}

void nod::update(){
        we=wei(l)+wei(r)+1;
        if(rev==1){
            swap(l,r);
            if(l){
                l->rev^=1;
            }
            if(r){
                r->rev^=1;
            }
            rev=0;
        }
}

nod* merge(nod *a,nod *b){
    if(a==NULL){
        return b;
    }
    if(b==NULL){
        return a;
    }
    a->update();
    b->update();
    if(a->priorit>b->priorit){
        a->r=merge(a->r,b);
        a->update();
        return a;
    }else{
        b->l=merge(a,b->l);
        b->update();
        return b;
    }
}

pair<nod*,nod*> split(nod *a,int poz){
    if(a==NULL){
        return {NULL,NULL};
    }
    a->update();
    if(poz<=wei(a->l)){
        pair<nod*,nod*> tmp=split(a->l,poz);
        a->l=tmp.second;
        a->update();
        return {tmp.first,a};
    }
    pair<nod*,nod*> tmp=split(a->r,poz-(wei(a->l)+1));
    a->r=tmp.first;
    a->update();
    return {a,tmp.second};
}

void insert(int val,int poz){
    pair<nod*,nod*> tmp=split(root,poz-1);
    root=merge(merge(tmp.first,new nod(val)),tmp.second);
}

int access(nod* a,int poz){
    a->update();
    if(wei(a->l)==poz-1){
        return a->val;
    }
    if(poz<=wei(a->l)){
        return access(a->l,poz);
    }
    return access(a->r,poz-(wei(a->l)+1));
}

void reverse_range(int p1,int p2){
    pair<nod*,nod*> tmp=split(root,p2);
    pair<nod*,nod*> tmp2=split(tmp.first,p1-1);
    tmp2.second->rev^=1;
    root=merge(merge(tmp2.first,tmp2.second),tmp.second);
}

void delete_node(nod *a){
    if(a->l){
        delete_node(a->l);
    }
    if(a->r){
        delete_node(a->r);
    }
    delete(a);
}

void delete_range(int p1,int p2){
    pair<nod*,nod*> tmp=split(root,p2);
    pair<nod*,nod*> tmp2=split(tmp.first,p1-1);
    delete_node(tmp2.second);
    root=merge(tmp2.first,tmp.second);
}

void output_all(nod *a){
    if(a==NULL){
        return;
    }
    a->update();
    output_all(a->l);
    fo<<a->val<<' ';
    output_all(a->r);
}

int main(){
    int t,x,y;
    char op;

    fi>>t>>x;
    while(t--){
        fi>>op;
        if(op=='I'){
            fi>>x>>y;
            insert(y,x);
        }else if(op=='A'){
            fi>>x;
            fo<<access(root,x)<<'\n';
        }else if(op=='R'){
            fi>>x>>y;
            reverse_range(x,y);
        }else if(op=='D'){
            fi>>x>>y;
            delete_range(x,y);
        }
    }
    output_all(root);
    fi.close();
    fo.close();
}