Cod sursa(job #3151713)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 22 septembrie 2023 17:24:41
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.98 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

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

mt19937 rnd(time(0));

class treap{
    public:
    treap *left;
    treap *right;
    int key;
    int priority;
    int saiz;
    bool lazy;
};

treap* root;

void propag(treap* &node)
{
    if(node==NULL)
        return ;
    if(node->lazy)
    {
        if(node->left!=NULL)
            node->left->lazy^=1;
        if(node->right!=NULL)
            node->right->lazy^=1;
        swap(node->left,node->right);
        node->lazy=false;
    }
}

void split(treap *node,treap* &left,treap* &right,int poz)
{
    if(node==NULL)
    {
        left=NULL;
        right=NULL;
        return ;
    }
    else
    {
        propag(node);
        if(((node->left!=NULL)?(node->left->saiz):0)<poz)
        {
            split(node->right,node->right,right,poz-((node->left!=NULL)?(node->left->saiz):0)-1);
            left=node;
        }
        else
        {
            split(node->left,left,node->left,poz);
            right=node;
        }
        if(node!=NULL)
        {
            node->saiz=((node->left!=NULL)?(node->left->saiz):0)+((node->right!=NULL)?(node->right->saiz):0);
            node->saiz++;
        }
    }
}

treap *merge_all(treap *left,treap *right)
{
    propag(left);
    propag(right);
    if(left==NULL)
        return right;
    if(right==NULL)
        return left;
    if(left->priority>right->priority)
    {
        left->right=merge_all(left->right,right);
        if(left!=NULL)
        {
            left->saiz=((left->left!=NULL)?(left->left->saiz):0)+((left->right!=NULL)?(left->right->saiz):0);
            left->saiz++;
        }
        return left;
    }
    else
    {
        right->left=merge_all(left,right->left);
        if(right!=NULL)
        {
            right->saiz=((right->left!=NULL)?(right->left->saiz):0)+((right->right!=NULL)?(right->right->saiz):0);
            right->saiz++;
        }
        return right;
    }
}

int search_value(treap* node,int x)
{
    propag(node);
    if(((node->left!=NULL)?(node->left->saiz):0)==x-1)
        return node->key;
    else if(((node->left!=NULL)?(node->left->saiz):0)>x-1)
        return search_value(node->left,x);
    else
        return search_value(node->right,x-((node->left!=NULL)?(node->left->saiz):0)-1);
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    int n,q,i,j,x,y;
    fin>>n>>q;
    for(i=1;i<=n;i++)
    {
        string s;
        fin>>s;
        if(s=="I")
        {
            fin>>x>>y;
            treap *left;
            treap *right;
            split(root,left,right,x-1);
            treap *aux=new treap;
            aux->key=y;
            aux->lazy=false;
            aux->saiz=1;
            aux->left=NULL;
            aux->right=NULL;
            aux->priority=rnd();
            root=merge_all(left,merge_all(aux,right));
        }
        else if(s=="A")
        {
            fin>>x;
            fout<<search_value(root,x)<<"\n";
        }
        else if(s=="R")
        {
            fin>>x>>y;
            treap *left;
            treap *right;
            treap *mij;
            split(root,left,right,y);
            split(left,left,mij,x-1);
            if(mij!=NULL)
                mij->lazy^=1;
            root=merge_all(left,merge_all(mij,right));
        }
        else
        {
            fin>>x>>y;
            treap *left;
            treap *right;
            treap *mij;
            split(root,left,right,y);
            split(left,left,mij,x-1);
            root=merge_all(left,right);
        }
    }
    int memo=root->saiz;
    for(i=1;i<=memo;i++)
        fout<<search_value(root,i)<<" ";
    fin.close();
    fout.close();
    return 0;
}