Cod sursa(job #2098877)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 3 ianuarie 2018 17:06:11
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.56 kb
#include<fstream>
#include<time.h>
#include<stdlib.h>
#define INF 1000000000
using namespace std;
int m, t, k, val, p, u;
char c;
struct nod{
    int val, vp, nr, inv;
    nod *st, *dr;
    nod(int val, int vp, int nr, int inv, nod *st, nod *dr){
        this->val = val;
        this->vp = vp;
        this->nr = nr;
        this->inv = inv;
        this->st = st;
        this->dr = dr;
    }
};
nod *r, *nill, *x, *y, *z, *aux;
ifstream fin("secv8.in");
ofstream fout("secv8.out");
void upd(nod *r){
    r->nr = r->st->nr + r->dr->nr + 1;
}
void lztr(nod *r){
    if(r->inv == 1){
        swap(r->st, r->dr);
        r->st->inv ^= 1;
        r->dr->inv ^= 1;
        r->inv = 0;
    }
}
void rotst(nod * &r){
    lztr(r);
    lztr(r->st);
    nod *aux = r->st;
    r->st = aux->dr;
    aux->dr = r;
    r = aux;
    upd(r->dr);
    upd(r);
}
void rotdr(nod * &r){
    lztr(r);
    lztr(r->dr);
    nod *aux = r->dr;
    r->dr = aux->st;
    aux->st = r;
    r = aux;
    upd(r->st);
    upd(r);
}
void gettr(nod * &r){
    if(r->st->vp > r->vp){
        rotst(r);
    }
    else{
        if(r->dr->vp > r->vp){
            rotdr(r);
        }
    }
}
void addtr(nod * &r, int p, int val, int t){
    if(r == nill){
        r = new nod(val, rand() % INF + 1, 1, 0, nill, nill);
        if(t == 1){
            r->vp = INF + 1;
        }
        return;
    }
    lztr(r);
    if(r->st->nr + 1 >= p){
        addtr(r->st, p, val, t);
    }
    else{
        addtr(r->dr, p - (r->st->nr + 1), val, t);
    }
    gettr(r);
    upd(r);
}
int srctr(nod *r, int p){
    lztr(r);
    if(r->st->nr + 1 == p){
        return r->val;
    }
    if(r->st->nr + 1 >= p){
        return srctr(r->st, p);
    }
    else{
        return srctr(r->dr, p - (r->st->nr + 1) );
    }
}
void deltr(nod * &r, int p){
    if(r == nill){
        return;
    }
    lztr(r);
    if(r->st->nr + 1 != p){
        if(p <= r->st->nr){
            deltr(r->st, p);
        }
        else{
            deltr(r->dr, p - (r->st->nr + 1) );
        }
        if(r != nill){
            upd(r);
        }
        return;
    }
    if(r->st == nill && r->dr == nill){
        delete r;
        r = nill;
    }
    else{
        if(r->st->vp > r->dr->vp){
            rotst(r);
            deltr(r->dr, r->dr->st->nr + 1);
        }
        else{
            rotdr(r);
            deltr(r->st, r->st->st->nr + 1);
        }
        if(r != nill){
            upd(r);
        }
    }
}
void split(nod * &r, int p, nod * &st, nod * &dr){
    addtr(r, p, 0, 1);
    st = r->st;
    dr = r->dr;
}
nod* join(nod *x, nod *y){
    nod *r = new nod(0, INF + 1, 0, 0, x, y);
    upd(r);
    deltr(r, x->nr + 1);
    return r;
}
void afis(nod *r){
    if(r != nill){
        lztr(r);
        afis(r->st);
        fout<< r->val <<" ";
        afis(r->dr);
    }
}
int main(){
    srand( time(0) );
    r = nill = new nod(0, 0, 0, 0, NULL, NULL);
    fin>> m >> t;
    for(; m; m--){
        fin>> c;
        if(c == 'I'){
            fin>> k >> val;
            addtr(r, k, val, 0);
            continue;
        }
        if(c == 'A'){
            fin>> k;
            fout<< srctr(r, k) <<"\n";
            continue;
        }
        fin>> p >> u;
        split(r, u + 1, aux, z);
        split(aux, p, x, y);
        if(c == 'D'){
            r = join(x, z);
        }
        else{
            y->inv ^= 1;
            r = join(x, y);
            r = join(r, z);
        }
    }
    afis(r);
    return 0;
}