Cod sursa(job #2976447)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 9 februarie 2023 10:36:59
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.64 kb
#include <iostream>
#include <fstream>
#include <set>
#include <ctime>
#include <random>

using namespace std;

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

int q, type;

struct treap_node {
    treap_node *left, *right;
    bool rev;
    int val, sz, prio;
};
treap_node *root;

mt19937 rng(time(0));
set <int> prio_list;
int get_prio()
{
    int x = rng();
    while(prio_list.find(x) != prio_list.end())
        x = rng();
    prio_list.insert(x);
    return x;
}

int get_size(treap_node *node)
{
    if(node == NULL)
        return 0;
    return node->sz;
}

void update_node(treap_node *&node)
{
    if(node == NULL)
        return;
    node->sz = 1 + get_size(node->left) + get_size(node->right);
}

void propag(treap_node *&node)
{
    if(node == NULL)
        return;
    if(node->rev == 0)
        return;
    if(node->left != NULL)
        node->left->rev ^= 1;
    if(node->right != NULL)
        node->right->rev ^= 1;
    swap(node->left, node->right);
    node->rev = 0;
}

treap_node *merge_treap(treap_node *st, treap_node *dr)
{
    propag(st);
    propag(dr);
    if(st == NULL)
        return dr;
    if(dr == NULL)
        return st;
    if(st->prio > dr->prio)
    {
        st->right = merge_treap(st->right, dr);
        update_node(st);
        return st;
    }
    else
    {
        dr->left = merge_treap(st, dr->left);
        update_node(dr);
        return dr;
    }
}

void split_treap(treap_node *node, treap_node *&st, treap_node *&dr, int poz)
{
    if(node == NULL)
    {
        st = NULL;
        dr = NULL;
        return;
    }
    propag(node);
    if(get_size(node->left) < poz)
    {
        split_treap(node->right, node->right, dr, poz - get_size(node->left) - 1);
        st = node;
    }
    else
    {
        split_treap(node->left, st, node->left, poz);
        dr = node;
    }
    update_node(node);
}

void insert_treap(int val)
{
    treap_node *aux = new treap_node;
    *aux = {NULL, NULL, 0, val, 1, get_prio()};
    root = merge_treap(root, aux);
}

int cautbin(treap_node *node, int val)
{
    propag(node);
    if(get_size(node->left) == val - 1)
        return node->val;
    if(get_size(node->left) >= val)
        return cautbin(node->left, val);
    else
        return cautbin(node->right, val - get_size(node->left) - 1);
}

int main()
{
    fin >> q >> type; /// de ce doamne de ce
    while(q--)
    {
        char op;
        int x, y;
        fin >> op;
        if(op == 'I')
        {
            fin >> x >> y;
            treap_node *st, *dr;
            split_treap(root, st, dr, x - 1);
            treap_node *add = new treap_node;
            *add = {NULL, NULL, 0, y, 1, get_prio()};
            dr = merge_treap(add, dr);
            root = merge_treap(st, dr);
        }
        if(op == 'A')
        {
            fin >> x;
            fout << cautbin(root, x) << '\n';
        }
        if(op == 'R')
        {
            fin >> x >> y;
            treap_node *st, *mij, *dr;
            split_treap(root, st, dr, y);
            split_treap(st, st, mij, x - 1);
            if(mij != NULL)
                mij->rev ^= 1;
            dr = merge_treap(mij, dr);
            root = merge_treap(st, dr);
        }
        if(op == 'D')
        {
            fin >> x >> y;
            treap_node *st, *mij, *dr;
            split_treap(root, st, dr, y);
            split_treap(st, st, mij, x - 1);
            root = merge_treap(st, dr);
        }
    }
    int n = root->sz;
    for(int i = 1; i <= n; i++)
        fout << cautbin(root, i) << ' ';
    return 0;
}