Cod sursa(job #3238332)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 24 iulie 2024 11:51:02
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <fstream>
#include <time.h>
#include <stdlib.h>
using namespace std;
ifstream fin("secv8.in");
ofstream fout("secv8.out");

struct node{
int val=0;
int sz=0;
int pr=0;
int rev=0;
node* l = NULL;
node* r = NULL;

node()=default;
node(int x){val = x,sz=1,pr=rand();}

};


void upd(node* r)
{
    if(r->rev)
    {
        r->rev = 0;
        if(r->l)
            r->l->rev = 1-r->l->rev;
        if(r->r)
            r->r->rev = 1-r->r->rev;
        swap(r->l,r->r);
    }
}

int sz(node* r)
{
    return (r==NULL) ? 0 : r->sz;
}


void split(node* root,int pos,node*& l,node*& r)
{
    if(root==NULL)
    {
        l=r=NULL;return;
    }
    upd(root);

    if(sz(root->l) < pos) split(root->r,pos-sz(root->l)-1,root->r,r),l=root;

    else split(root->l,pos,l,root->l),r=root;

    root->sz = 1 + sz(root->l) + sz(root->r);
}
void merge(node*& root,node* l,node* r)
{
    if(l==NULL){root = r; return;}
    if(r==NULL){root = l; return;}

    upd(l);
    upd(r);
    if(l->pr < r->pr)
    {
        merge(l->r,l->r,r);
        root = l;
    }
    else
    {
        merge(r->l,l,r->l);
        root = r;
    }
    root->sz = 1 + sz(root->l) + sz(root->r);
}
void print(node* nod)
{
    if(nod==NULL)
        return;
    upd(nod);
    print(nod->l);
    fout<<nod->val<<' ';
    print(nod->r);
}

void reverse(int st,int dr,node*& nod)
{
    node* d,*b;
    split(nod,dr,nod,b);
    split(nod,st-1,nod,d);
    d->rev = 1;
    merge(nod,nod,d);
    merge(nod,nod,b);
}

void insert(int pos,int val,node*& nod)
{
    node* a;
    split(nod,pos-1,nod,a);
    merge(nod,nod,new node(val));
    merge(nod,nod,a);
}
int get(int pos,node*& nod)
{
    node *a,*b;
    split(nod,pos-1,nod,a);
    split(a,1,a,b);
    int x = a->val;
    merge(a,a,b);
    merge(nod,nod,a);
    return x;
}
void del(int st,int dr,node*& nod)
{
    node *a,*b;
    split(nod,st-1,a,nod);
    split(nod,dr-st+1,b,nod);
    merge(nod,a,nod);
}


int main()
{
    int n,p;
    node* r = NULL;
    fin>>n>>p;
    for(int i=1;i<=n;i++)
    {
        char op;
        fin>>op;
        if(op=='I')
        {
            int k,e;
            fin>>k>>e;
            insert(k,e,r);
        }
        else if(op=='A')
        {
            int k;
            fin>>k;
            fout<<get(k,r)<<'\n';
        }
        else if(op=='R')
        {
            int st,dr;
            fin>>st>>dr;
            reverse(st,dr,r);
        }
        else if(op=='D')
        {
            int st,dr;
            fin>>st>>dr;
            del(st,dr,r);
        }
    }

    print(r);

}