Cod sursa(job #1839289)

Utilizator mariusn01Marius Nicoli mariusn01 Data 2 ianuarie 2017 18:18:46
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.3 kb
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define INF 2000000000

using namespace std;
ifstream fin ("secv8.in");
ofstream fout("secv8.out");

struct treap {
    int priority;
    int value;
    int nodes;
    int reversed;
    treap *left, *right;
    treap (int priority, int value, int nodes, int reversed, treap *left, treap *right) {
        this->priority = priority;
        this->value = value;
        this->nodes = nodes;
        this->reversed = reversed;
        this->left = left;
        this->right = right;
    }
};

treap *r, *nil, *rL, *rR, *raux;
int n, position, value, st, dr;
char op;



void updateReversed(treap *r) {
    if (r->reversed == 1 && r != nil) {
        r->left->reversed = 1 - r->left->reversed;
        r->right->reversed = 1 - r->right->reversed;
        treap *aux = r->left;
        r->left = r->right;
        r->right = aux;
        r->reversed = 0;
    }
}

void updateNodes(treap *r) {
    if (r == nil)
        r->nodes = 0;
    else
        r->nodes = 1 + r->left->nodes + r->right->nodes;
}

int Rand()
{
    return 1 + (((rand()%32768)<<15) + rand()%32768 + 1 );
}

void show(treap *r, int level) {
    if (r != nil) {
        updateReversed(r);
        show(r->right, level+1);
        for (int i=1;i<=level;i++)
            cout<<"  ";
        cout<<r->value<<" "<<r->nodes<<"\n";
        show(r->left, level+1);
    }
}

void rotateRight(treap * &r) {
    treap *f = r->left;
    r->left = f->right;
    f->right = r;
    r = f;
}

void rotateLeft(treap * &r) {
    treap *f = r->right;
    r->right = f->left;
    f->left = r;
    r = f;
}

void ballance(treap * &r) {
    if (r->priority < r->left->priority) {
        rotateRight(r);
        updateNodes(r->right);
        updateNodes(r);
    }
    else
        if (r->priority < r->right->priority) {
            rotateLeft(r);
            updateNodes(r->left);
            updateNodes(r);
        }
}

void insertNode(treap * &r, int position, int priority, int value, int nodes, int reversed) {
    if (r == nil) {
        r = new treap(priority, value, 1, 0, nil, nil);
    } else {
        updateReversed(r);
        if (r->left->nodes >= position-1)
            insertNode(r->left, position, priority, value, nodes, reversed);
        else
            insertNode(r->right, position - r->left->nodes - 1, priority, value, nodes, reversed);
        ballance(r);
        updateNodes(r);
    }
}

treap *access(treap *r, int position) {
    updateReversed(r);
    updateNodes(r);
    if (r->left->nodes == position - 1)
        return r;
    else
        if (r->left->nodes > position-1)
            return access(r->left, position);
        else
            return access(r->right, position - r->left->nodes - 1);
}

void eraseNode(treap * &r, int value) {
    if (r->left == nil && r->right == nil) {
        if (r->value == value) {
            delete r;
            r = nil;
        }
    } else {
        updateReversed(r);
        if (r->left->priority > r->right->priority) {
            updateReversed(r->left);
            rotateRight(r);

            eraseNode(r->right, value);
        } else {
            updateReversed(r->right);
            rotateLeft(r);
            //updateReversed(r);
            eraseNode(r->left, value);

        }
        updateNodes(r);
    }
}

void split(treap *r, int position, treap * &rL, treap * &rR) {
    insertNode(r, position, INF, INF, 0, 0);

    rL = r->left;
    rR = r->right;
    delete r;
}

void join(treap * &r, treap *rL, treap *rR) {
    r = new treap(-1, INF, rL->nodes + rR->nodes, 0, rL, rR);
    eraseNode(r, INF);
}

void dfs(treap *r) {
    if (r != nil) {
        updateReversed(r);
        updateNodes(r);
        dfs(r->left);
        fout<<r->value<<" ";
        dfs(r->right);
    }
}

void dfs1(treap *r) {
    if (r != nil) {
        dfs1(r->left);
        cout<<r->value<<"-"<<r->nodes<<"\n";
        dfs1(r->right);
    }
}



int main () {
    srand(time(0));
    //void insertNode(treap * &r, int position, int priority, int value, int nodes, int reversed) {

    r = nil = new treap(0, 0, 0, 0, NULL, NULL);
    int k;
    fin>>n>>k;
    for (;n--;) {
        fin>>op;
        if (op == 'I') {
            fin>>position>>value;
            insertNode(r, position, Rand(), value, 0, 0);
            //show(r, 0);
            //cout<<"\n";
            continue;
        }
        if (op == 'A') {
            fin>>position;
            treap *aux = access(r, position);
            fout<<aux->value<<"\n";
            //show(r, 0);
            //cout<<"\n";
            continue;
        }
        if (op == 'R') {
            fin>>st>>dr;
            split(r, dr+1, raux, rR);
            split(raux, st, rL, r);
            r->reversed = 1;
            join(raux, rL, r);
            join(r, raux, rR);
            //show(r, 0);
            //cout<<"\n";
            continue;
        }
        if (op == 'D') {
            fin>>st>>dr;
            split(r, dr+1, raux, rR);
            split(raux, st, rL, r);
            join(r, rL, rR);
            //show(r, 0);
            //cout<<"\n";
            continue;
        }
    }
    dfs(r);
    //show(r, 0);
    return 0;
}