Cod sursa(job #2213938)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 18 iunie 2018 00:09:14
Problema Secv8 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.38 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

ifstream in ("secv8.in");
ofstream out("secv8.out");

struct Treap {
    int sz;
    int prio;
    int val;

    Treap *le;
    Treap *ri;

    bool rev;

    Treap(int inputval) {
        sz = 1;
        prio = rand();
        val = inputval;
        le = ri = NULL;
        rev = 0;
    }

    void compute() {
        clean();
        sz = 1;
        if(le != NULL)
            sz += le->sz;
        if(ri != NULL)
            sz += ri->sz;
    }

    void clean() {
        if(rev == 1) {
            Treap* aux = le;
            le = ri;
            ri = aux;

            if(le != NULL)
                le->rev ^= 1;
            if(ri != NULL)
                ri->rev ^= 1;
            rev = 0;
        }
    }
};

void merge(Treap* le, Treap* ri, Treap* &ans) {
    if(le == NULL) {
        ans = ri;
    } else if(ri == NULL) {
        ans = le;
    } else {
        le->compute();
        ri->compute();
        if(le->prio < ri->prio) {
            merge(le, ri->le, ri->le);
            ans = ri;
        } else {
            merge(le->ri, ri, le->ri);
            ans = le;
        }
    }
    if(ans != NULL)
        ans->compute();
}

void split(Treap* input, int pos, Treap* &le, Treap* &ri) {
    if(input == NULL) {
        le = ri = NULL;
    } else {
        input->compute();

        int key = 1;
        if(input->le != NULL)
            key += input->le->sz;

        if(key < pos) {
            split(input->ri, pos - key, input->ri, ri);
            le = input;
            le->compute();
        } else {
            split(input->le, pos, le, input->le);
            ri = input;
            ri->compute();
        }
    }
}

void Sinsert(Treap* &root, int pos, int val) {
    Treap *le, *ri, *le2;
    split(root, pos - 1, le, ri);
    Treap* nod = new Treap(val);
    merge(le, nod, le2);
    merge(le2, ri, root);
}

int Saccess(Treap* &root, int pos) {
    Treap *le, *ri, *le2, *ri2;
    split(root, pos, le, ri);
    split(le, pos - 1, le2, ri2);
    int ans = ri2->val;
    merge(le2, ri2, le);
    merge(le, ri, root);
    return ans;
}

int Sreverse(Treap* &root, int i, int j) {
    Treap *le, *ri, *le2, *ri2;
    split(root, j, le, ri);
    split(le, i - 1, le2, ri2);
    if(ri2 != NULL)
        ri2->rev ^= 1;
    merge(le2, ri2, le);
    merge(le, ri, root);
}

int Sdelete(Treap* &root, int i, int j) {
    Treap *le, *ri, *le2, *ri2;
    split(root, j, le, ri);
    split(le, i - 1, le2, ri2);
    merge(le2, ri, root);
}

int main() {
    srand(time(NULL));
    Treap* root = NULL;

    int n, nothing;
    in >> n >> nothing;

    for(int i = 1; i <= n; ++ i) {
        char c;
        in >> c;
        if(c == 'I') {
            int a, b;
            in >> a >> b;
            Sinsert(root, a, b);
        } else if(c == 'A') {
            int a;
            in >> a;
            out << Saccess(root, a) << '\n';
        } else if(c == 'R') {
            int a, b;
            in >> a >> b;
            Sreverse(root, a, b);
        } else if(c == 'D') {
            int a, b;
            in >> a >> b;
            Sdelete(root, a, b);
        }
    }

    for(int i = 1; i <= root->sz; ++ i) {
        out << Saccess(root, i) << " ";
    }

    return 0;
}