Cod sursa(job #3308522)

Utilizator nicushor21Pirlog Marian Nicolae nicushor21 Data 25 august 2025 19:42:39
Problema Secv8 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.71 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("secv8.in");
ofstream fout("secv8.out");

int n,c,x,y;
char s;

int random(){
    return (rand()<<8)+rand();
}

struct nod{
    int e,pri;

    int l,r;

    nod *st,*dr;

    nod(int _e){
        e = _e;
        pri = random();
        l = r = 0;
        st = dr = nullptr;
    }
    nod(int _e, int p){
        e = _e;
        pri = p;
        l = r = 0;
        st = dr = nullptr;
    }
    nod(int _e, nod *s, nod *d){
        e = _e;
        pri = random();
        st = s;
        dr = d;
        l = r = 0;
    }
    nod(int _e, int p, nod *s, nod *d){
        e = _e;
        pri = p;
        st = s;
        dr = d;
        l = r = 0;
    }
};

void propag(nod *r){
    if(r && r->e < 0){
        r->e *= -1;
        swap(r->st, r->dr);
        swap(r->l, r->r);
        if(r->st)
            r->st->e *= -1;
        if(r->dr)
            r->dr->e *= -1;
    }
}

void propagB(nod *r){
    propag(r);
    if(r->st)
        propag(r->st);
    if(r->dr)
        propag(r->dr);
}

void show(nod *r){
    if(!r)
        return;

    propag(r);

    show(r->st);
    fout<<r->e-1<<' ';
    show(r->dr);
}

void showC(nod *r){
    if(!r)
        return;

    propag(r);

    showC(r->st);
    cout<<r->e-1<<','<<r->pri<<','<<r->l<<','<<r->r<<' ';
    showC(r->dr);
}

void clr(nod *r){
    if(!r)
        return;

    clr(r->st);
    clr(r->dr);
    delete r;
}

void rotL(nod *&r){
    nod *a = r->dr;
    r->dr = a->st;
    a->st = r;
    r->r = 0;
    if(r->dr)
        r->r = r->dr->l+r->dr->r+1;
    a->l = r->l+r->r+1;
    r = a;
}

void rotR(nod *&r){
    nod *a = r->st;
    r->st = a->dr;
    a->dr = r;
    r->l = 0;
    if(r->st)
        r->l = r->st->l+r->st->r+1;
    a->r = r->l+r->r+1;
    r = a;
}

void balance(nod *&r){
    propagB(r);

    if(r->dr && r->dr->pri > r->pri)
        rotL(r);
    else if(r->st && r->st->pri > r->pri)
        rotR(r);
}

void ins(nod *a, int k, nod *&r, int p){
    if(!r){
        r = a;
        return;
    }

    propagB(r);

    if(p < k){
        if(r->dr)
            p += r->dr->l;
        r->r++;
        ins(a, k, r->dr, p+1);
        balance(r);
    }else{
        if(r->st)
            p -= r->st->r;
        r->l++;
        ins(a, k, r->st, p-1);
        balance(r);
    }
}

nod* src(int k, nod *r, int p){
    propagB(r);

    if(p == k)
        return r;

    if(p < k)
        return src(k, r->dr, p+1+r->dr->l);
    return src(k, r->st, p-1-r->st->r);
}

void ers(int k, nod *&r, int p){
    if(!r)
        return;

    propagB(r);

    if(p < k){
        ers(k, r->dr, p+1+r->dr->l);
        r->r--;
    }else if(p > k){
        ers(k, r->st, p-1-r->st->r);
        r->l--;
    }else{
        if(!r->st && !r->dr){
            delete r;
            r = nullptr;
        }else{
            p -= r->l+1;
            if(r->dr && r->st){
                if(r->dr->pri > r->st->pri)
                    rotL(r);
                else
                    rotR(r);
            }else if(r->dr){
                rotL(r);
            }else{
                rotR(r);
            }
            p += r->l+1;
            ers(k, r, p);
        }
    }
}

void split(int k, nod *&r, nod *&t){
    nod *a = new nod(1, INT_MAX);
    ins(a, k, r, r->l+1);
    t = a->dr;
    r = a->st;
    delete a;
}

void join(int k, nod *&r, nod *&t){
    nod *a = new nod(1, 0, r, t);
    if(a->st)
        a->l = r->l + r->r + 1;
    if(a->dr)
        a->r = t->l + t->r + 1;
    r = a;
    ers(k, r, r->l+1);
}

void del(int x, int y, nod *&r){
    nod *a, *b;
    split(y+1, r, b);
    split(x, r, a);
    join(x, r, b);
    clr(a);
}
/*void del(int x, int y, nod *&r){
    for(int i=x;i<=y;i++)
        ers(x, r, r->l+1);
}*/

void rev(int x, int y, nod *&r){
    nod *a, *b;
    split(y+1, r, b);
    split(x, r, a);
    a->e *= -1;
    propagB(a);
    join(x, r, a);
    propagB(r);
    join(y+1, r, b);
    propagB(r);
}

nod *r, *t;

int main()
{
    srand(time(0));

    fin>>n>>c;
    while(n--){
        fin>>s;
        if(s == 'I'){
            fin>>x>>y;
            t = new nod(y+1);
            if(r)
                ins(t, x, r, r->l+1);
            else
                ins(t, x, r, 0);
        }
        if(s == 'A'){
            fin>>x;
            fout<<src(x, r, r->l+1)->e-1<<'\n';
        }
        if(s == 'R'){
            fin>>x>>y;
            rev(x, y, r);
        }
        if(s == 'D'){
            fin>>x>>y;
            del(x, y, r);
        }
        cout<<n<<'\n';
    }
    show(r);
    clr(r);
    return 0;
}