Cod sursa(job #3299257)

Utilizator Turcanu_DavidTurcanu David Turcanu_David Data 5 iunie 2025 10:03:20
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.64 kb
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using pii = pair<int, int>;

#define cin fin
#define cout fout
ifstream cin("secv8.in");
ofstream cout("secv8.out");

mt19937 rng(time(NULL));

struct Treap
{
    struct item
    {
        int prior, value, cnt;
        bool rev;

        item* l;
        item* r;

        item(int x = 0): prior(rng()), value(x), cnt(1), rev(false), l(nullptr), r(nullptr) {}
    };
    using pitem = item*;

    pitem root = nullptr;

    int cnt(pitem it)
    {
        return it? it -> cnt: 0;
    }

    void upd_cnt(pitem& it)
    {
        it -> cnt = cnt(it -> l) + cnt(it -> r) + 1;
    }

    void push(pitem& it)
    {
        if(it && it -> rev)
        {
            it -> rev = false;
            swap(it -> l, it -> r);
            if(it -> l)
                it -> l -> rev ^= 1;
            if(it -> r)
                it -> r -> rev ^= 1;
        }
    }

    void merge(pitem& it, pitem l, pitem r)
    {
        if(!l || !r)
        {
            it = l? l: r;
            return;
        }
//        push(it);
        push(l);
        push(r);
        if(l -> prior > r -> prior)
        {
            merge(l -> r, l -> r, r);
            it = l;
        }
        else
        {
            merge(r -> l, l, r -> l);
            it = r;
        }
        upd_cnt(it);
    }

    void split(pitem it, pitem& l, pitem& r, int pos)
    {
        if(!it)
        {
            l = r = nullptr;
            return;
        }
        push(it);
        int szl = cnt(it -> l) + 1;
        if(szl <= pos)
        {
            split(it -> r, it -> r, r, pos - szl);
            l = it;
        }
        else
        {
            split(it -> l, l, it -> l, pos);
            r = it;
        }
        upd_cnt(it);
    }

    void insert(int pos, int value)
    {
        pitem t1, t2;
        split(root, t1, t2, pos - 1);
        merge(root, t1, new item(value));
        merge(root, root, t2);
    }

    int access(int pos)
    {
        pitem t1, t2, t3;
        split(root, t1, t2, pos - 1);
        split(t2, t2, t3, 1);
        int val = t2 -> value;
        merge(root, t1, t2);
        merge(root, root, t3);
        return val;
    }

    void reverse(int l, int r)
    {
        pitem t1, t2, t3;
        split(root, t1, t2, l - 1);
        split(t2, t2, t3, r - l + 1);
        t2 -> rev ^= 1;
        merge(root, t1, t2);
        merge(root, root, t3);
    }

    void erase(int l, int r)
    {
        pitem t1, t2, t3;
        split(root, t1, t2, l - 1);
        split(t2, t2, t3, r - l + 1);
        merge(root, t1, t3);
    }

    void output(pitem it)
    {
        push(it);
        if(!it)
            return;
        output(it -> l);
        cout << it -> value << ' ';
        output(it -> r);
    }
};

Treap treap;

int32_t main()
{
    int q, slab;
    cin >> q >> slab;
//    treap.insert(1, 1);
//    treap.insert(2, 2);
//    treap.insert(2, 3);
//    treap.reverse(1, 3);
//    cout << treap.access(1);
    while(q--)
    {
        char ch;
        cin >> ch;
        int x, y;
        if(ch == 'I')
        {
            cin >> x >> y;
            treap.insert(x, y);
        }
        if(ch == 'A')
        {
            cin >> x;
            cout << treap.access(x) << '\n';
        }
        if(ch == 'R')
        {
            cin >> x >> y;
            treap.reverse(x, y);
        }
        if(ch == 'D')
        {
            cin >> x >> y;
            treap.erase(x, y);
        }
    }
    treap.output(treap.root);
    return 0;
}