Cod sursa(job #1294053)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 16 decembrie 2014 22:09:23
Problema Secv8 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.46 kb
#include<iostream>
#include<fstream>
#include<time.h>
#include<cstdlib>
using namespace std;

const int N = 30100;
const int inf = 2000000000;

struct t {
    int k, nrel;
    int p;
    t *f1, *f2;

    t() {
        k = p = 0;
        nrel = 0;
    }

    t(int a, int b, t *c, t *d) {
        k = a; p = b;
        f1 = c; f2 = d;
        nrel = 1;
    }
};

t *rad, *nil;

int n;

void rotLeft(t* &r) {
    t *temp = r->f1;
    r->f1 = temp->f2;
    temp->f2 = r;
    r = temp;
}

void rotRight(t* &r) {
    t *temp = r->f2;
    r->f2 = temp->f1;
    temp->f1 = r;
    r = temp;
}

void recalc(t* &r) {
    if(r != nil)
        r->nrel = 1 + r->f1->nrel + r->f2->nrel;
}

void balance(t* &r) {
    if(r->f2->p > r->p && r->f2->p >= r->f1->p)
        rotRight(r);
    else if(r->f1->p > r->p)
        rotLeft(r);

    recalc(r->f1);
    recalc(r->f2);
    recalc(r);
}

void insert(t* &r, int key, int val, int pri) {
    if(r == nil) {
        r = new t(key, pri, nil, nil);
        return;
    }

    if(r->f1->nrel < val)
        insert(r->f2, key, val - (r->f1->nrel) - 1, pri);
    else
        insert(r->f1, key, val, pri);

    balance(r);
}

void erase(t* &r, int val) {
    if(val == 0 || val == r->f1->nrel + 1) {
        if(r->f1 == nil && r->f2 == nil)
            r = nil;
        else {

            r->p = 0;
            balance(r);

            if(r->f1->p == 0 && r->f1->k == 666)
                erase(r->f1, 0);
            else
                erase(r->f2, 0);
        }

        recalc(r);

        return;
    }

    if(r->f1->nrel >= val) {
        erase(r->f1, val);
        recalc(r);
        return;
    }

    if(val > r->f1->nrel + 1)
        erase(r->f2, val - r->f1->nrel - 1);
    recalc(r);
}

int query(t* &r, int val) {

    if(val <= r->f1->nrel)
        return query(r->f1, val);

    val -= r->f1->nrel + 1;
    if(val == 0)
        return r->k;

    return query(r->f2, val);
}

void split(t* &r, t* &a1, t* &a2, int val) {
    insert(r, 666, val, inf);
    a1 = r->f1;
    a2 = r->f2;
}

void join(t* &r, t* &a1, t* &a2) {
    r = new t(666, 0, a1, a2);
    erase(r, a1->nrel + 1);
}

void deleteSecv(int poz1, int poz2) {
    t *a1, *a2, *a3, *a4;

    split(rad, a4, a3, poz2);
    split(a4, a1, a2, poz1 - 1);

    join(rad, a1, a3);
}

void print(t* &r) {
    if(r == nil)
        return;
    print(r->f1);
    printf("%d ", r->k);
    print(r->f2);
}

int main() {
    freopen("secv8.in", "r", stdin);
    freopen("secv8.out", "w", stdout);
    int i;

    srand(777);
    nil = new t;
    nil->f1 = nil->f2 = nil;
    rad = nil;

int x;
    cin >> n;
    cin >> x;

    if(x == 0)
        x /= 0;
    else
        return 0;

    for(i = 1; i <= n; ++i) {
        char op;
        cin >> op;



        /*if(i != 1) {
            print(rad);
            cout << "\n";
        }*/



        if(op == 'I') {
            int key, e;
            cin >> e >> key;

            insert(rad, key, e - 1, rand()%inf + 1);

            continue;
        }
        if(op == 'A') {
            int poz;
            cin >> poz;
            cout << query(rad, poz) << "\n";
            continue;
        }
        if(op == 'R') {

            continue;
        }

        // D
        int poz1, poz2;
        cin >> poz1 >> poz2;
        deleteSecv(poz1, poz2);
    }

    print(rad);

    return 0;
}