Cod sursa(job #1835211)

Utilizator akaprosAna Kapros akapros Data 26 decembrie 2016 16:00:46
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.95 kb
#include <bits/stdc++.h>
#define maxN 100002
#define pnn pair<Nod*, Nod*>
using namespace std;
int useless, m, tsize;

FILE *fin = freopen("secv8.in", "r", stdin);
FILE *fout = freopen("secv8.out", "w", stdout);

struct Nod
{
    Nod* st;
    Nod* dr;
    int val, rev;
    long long key;
    int size;
};
Nod* emptyNode;
Nod* rad;
bool isEmptyNode(Nod* rad)
{
    return rad == emptyNode;
}
void recompute(Nod* nod)
{
    if (nod == emptyNode)
        return ;
    nod->size = nod->st->size + 1 + nod->dr->size;
    if (nod->rev == 1)
    {
        nod->rev = 0;
        Nod* aux = nod->st;
        nod->st = nod->dr;
        nod->dr = aux;
        if (nod->st != emptyNode)
            nod->st->rev = !nod->st->rev;
        if (nod->dr != emptyNode)
            nod->dr->rev = !nod->dr->rev;
    }
}


pnn split(Nod* rad, int sizeFirst)
{
    recompute(rad);
    if (!(0 <= sizeFirst && sizeFirst <= rad->size))
        while (1);
    pair<Nod*, Nod*> answer;
    if (isEmptyNode(rad))
        answer.first = answer.second = emptyNode;
    else if (rad->st->size < sizeFirst)
    {
        pair<Nod*, Nod*> p = split(rad->dr, sizeFirst - rad->st->size - 1);
        answer.first = rad;
        rad->dr = p.first;
        answer.second = p.second;
        recompute(rad);
    }
    else // if (sizeFirst <= rad->st->size)
    {
        pair<Nod*, Nod*> p = split(rad->st, sizeFirst);
        answer.second = rad;
        rad->st = p.second;
        answer.first = p.first;
        recompute(rad);
    }


    return answer;
}


Nod* join(Nod* first, Nod* second)
{
    recompute(first);
    recompute(second);
    if (isEmptyNode(first))
        return second;
    if (isEmptyNode(second))
        return first;
    if (second->key > first->key)
    {
        second->st = join(first, second->st);
        recompute(second);
        return second;
    }
    else   // second->key <= first->key
    {
        first->dr = join(first->dr, second);
        recompute(first);
        return first;
    }
}
Nod* insert(Nod* rad, int index, int val)
{
    //recompute(rad);
    if(!(0 <= index && index <= rad->size))
        while (1);
    Nod* nodNou = new Nod();
    nodNou->val = val;
    nodNou->st = nodNou->dr = emptyNode;
    nodNou->key =((long long)rand() << 45
                  ^ (long long)rand() << 30
                  ^ (long long)rand() << 15
                  ^ (long long)rand() <<  0)
                 & 0x7fffffffffffffff;
    nodNou->size = 1;
    nodNou->rev = 0;
    pair<Nod*, Nod*> p = split(rad, index);
    //recompute(p.first); recompute(p.second);
    return join(join(p.first, nodNou), p.second);
}
void update(Nod *rad, int x1, int x2)
{
    recompute(rad);
    pair<Nod*, Nod*> p = split(rad, x2);
    pair<Nod*, Nod*> q = split(p.first, x1);
    q.second->rev = !q.second->rev;
    //recompute(q.second);
    join(join(q.first, q.second), p.second);
    //recompute(rad);
}
int getKthElement(Nod* &rad, int index)
{
    recompute(rad);
    if (!(0 <= index && index < rad->size))
        while (1);
    if (rad->st->size < index)
        return getKthElement(rad->dr, index - rad->st->size - 1);
    else if (rad->st->size == index)
        return rad->val;
    else // if (index < rad->st->size)
        return getKthElement(rad->st, index);
}

void deleteAll(Nod* rad)
{
    if (rad != emptyNode)
    {
        deleteAll(rad->st);
        deleteAll(rad->dr);
        delete rad;
    }
}
Nod* eraseAll(Nod* rad, int x1, int x2)
{
    assert(0 <= x1 && x1 < x2 && x2 <= rad->size);
    pair<Nod*, Nod*> p = split(rad, x2);
    pair<Nod*, Nod*> q = split(p.first, x1);
    deleteAll(q.second);
    return join(q.first, p.second);
}

void read()
{
    scanf("%d %d", &m, &useless);
}
void write()
{
    while (m --)
    {
        int k, e, x, y;
        char q;
        scanf("\n%c", &q);
        if (q == 'I')
        {
            scanf("%d %d", &k, &e);
            rad = insert(rad, k - 1, e);
            ++ tsize;
        }
        else if (q == 'A')
        {
            scanf("%d", &k);
            printf("%d\n", getKthElement(rad, k - 1));
        }
        else if (q == 'R')
        {
            scanf("%d %d", &x, &y);
            if (x > y)
                swap(x, y);
            if (x != y)
                update(rad, x - 1, y);
        }
        else if (q == 'D')
        {
            scanf("%d %d", &x, &y);
            tsize -= (y - x + 1);
            if (x > y)
                swap(x, y);
            rad = eraseAll(rad, x - 1, y);
        }
    }
    for (int k = 0; k < tsize; ++ k)
        printf("%d ", getKthElement(rad, k));
}
int main()
{
    emptyNode = new Nod();
    emptyNode->val = 0;
    emptyNode->key = -1;
    emptyNode->st = emptyNode;
    emptyNode->dr = emptyNode;
    emptyNode->size = 0;
    emptyNode->rev = 0;
    rad = emptyNode;
    read();
    //solve();
    write();
    return 0;
}