Cod sursa(job #1975803)

Utilizator Radu_GeorgeRadu George Radu_George Data 2 mai 2017 00:08:57
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <bits/stdc++.h>
#define MOD 1000000009

using namespace std;
ofstream fout("secv8.out");

struct Node
{
    Node *Left,*Right;
    int pr,lazy,cnt,val;
    Node(int x)
    {
        Left=Right=0;
        pr=rand()%MOD;
        lazy=0;
        cnt=1;
        val=x;
    }
} *rad = 0;

int cnt(Node *node)
{
    if(!node) return 0;
    return node->cnt;
}

void upd(Node *node)
{
    if(!node) return;
    node->cnt=cnt(node->Left)+cnt(node->Right)+1;
}

void propag(Node *node)
{
    if(!node || !node->lazy) return;
    swap(node->Left,node->Right);
    if(node->Left)
        node->Left->lazy^=1;
    if(node->Right)
        node->Right->lazy^=1;
    node->lazy=0;
}

Node *Merge(Node *L, Node *R)
{
    if(!L) return R;
    if(!R) return L;
    propag(L); upd(L);
    propag(R); upd(R);
    if(L->pr > R->pr)
    {
        L->Right=Merge(L->Right,R);
        upd(L);
        return L;
    }
    R->Left=Merge(L,R->Left);
    upd(R);
    return R;
}

pair <Node*,Node*> Split(Node *node, int k)
{
    if(!node) return make_pair((Node*)0,(Node*)0);
    propag(node); upd(node);
    if(cnt(node->Left)>=k)
    {
        pair <Node*,Node*> w=Split(node->Left,k);
        node->Left=w.second;
        upd(node);
        return make_pair(w.first,node);
    }
    pair <Node*,Node*> w=Split(node->Right,k-cnt(node->Left)-1);
    node->Right=w.first;
    upd(node);
    return make_pair(node,w.second);
}

void Solve(Node *nod)
{
    if(!nod) return;
    propag(nod); upd(nod);
    Solve(nod->Left);
    fout<<nod->val<<" ";
    Solve(nod->Right);
}

int main()
{
    int T,x,y;
    char tip;
    ifstream cin("secv8.in");
    srand(time(0));
    cin>>T>>x;
    while(T--)
    {
        cin>>tip>>x;
        if(tip=='A')
        {
            pair<Node*,Node*> w=Split(rad,x);
            pair<Node*,Node*> w1=Split(w.first,x-1);
            fout<<w1.second->val<<"\n";
            rad=Merge(Merge(w1.first,w1.second),w.second);
        }
        else
        {
            cin>>y;
            if(tip=='I')
            {
                --x;
                pair<Node*,Node*> w=Split(rad,x);
                rad=Merge(Merge(w.first,new Node(y)),w.second);
            }
            else
                if(tip=='R')
                {
                    pair<Node*,Node*> w=Split(rad,x-1);
                    pair<Node*,Node*> w1=Split(w.second,y-x+1);
                    w1.first->lazy^=1;
                    rad=Merge(Merge(w.first,w1.first),w1.second);
                }
                else
                {
                    pair<Node*,Node*> w=Split(rad,x-1);
                    pair<Node*,Node*> w1=Split(w.second,y-x+1);
                    rad=Merge(w.first,w1.second);
                }
        }
    }

    Solve(rad);
    return 0;
}