Cod sursa(job #3238220)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 23 iulie 2024 14:34:50
Problema Secv8 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.75 kb
#include <fstream>
#include <stdlib.h>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("secv8.in");
ofstream fout("secv8.out");

const int INF = 2e9;

struct node{
int v = 0;
int p = 0;
int c = 0;
int rev = 0;
node* l;
node* r;

node()=default;
node(int _v,int _p,int _c,int _rev,node* _l,node* _r)
{
    v = _v,p=_p,c=_c,rev=_rev,l=_l,r=_r;
}

};


node *root,*nul;

void update(node* &nod)
{
    if (nod == nul)
        return;
    if(nod->rev)
    {
        if(nod->l != nul)   nod->l->rev = 1-nod->l->rev;
        if(nod->r != nul)   nod->r->rev = 1-nod->r->rev;
        swap(nod->l,nod->r),nod->rev = 0;
    }
    nod->c = 1 + nod->l->c + nod->r->c;
}

void rot_right(node* &nod)
{
    node* lc = nod->l;
    nod->l = lc->r;lc->r=nod;
    nod = lc;
}
void rot_left(node* &nod)
{
    node* rc = nod->r;
    nod->r = rc->l;rc->l=nod;
    nod = rc;
}
void balance(node* &nod)
{
    if(nod==nul)
        return;
    update(nod);
    update(nod->l);
    update(nod->r);
    if(nod->p < nod->l->p)
    {
        rot_right(nod);
        update(nod->r);
        update(nod);
    }
    else if (nod->p < nod->r->p)
    {
        rot_left(nod);
        update(nod->l);
        update(nod);
    }
}

void insert(node* &nod,int poz,node* ins)
{
    if(nod==nul)
    {
        nod = ins;
        nod->l = nul;
        nod->r = nul;
        return;
    }
    update(nod);
    if(poz > nod->l->c + 1)
        insert(nod->r,poz - nod->l->c - 1,ins);
    else
        insert(nod->l,poz,ins);
    update(nod);
    balance(nod);

}
void erase(node* &nod,int val)
{
    update(nod);
    if(nod->l == nul && nod->r == nul)
    {
        if(nod->v == val)
            delete nod,nod=nul;
        return;
    }
    if(nod->l->p > nod->r->p)
    {
        update(nod->l);
        rot_right(nod);
        erase(nod->r,val);
        update(nod);
    }
    else
    {
        update(nod->r);
        rot_left(nod);
        erase(nod->l,val);
        update(nod);
    }
    update(nod);
}
node *a,*b,*c,*d;
// how many in first
void split(node* nod,int pos,node* &ls,node* &rs)
{
    update(nod);
    insert(nod,pos+1,new node(INF,INF,1,0,nul,nul));
    ls = nod->l;
    rs = nod->r;
    delete nod;
}
void merge(node* l,node* r,node* &rez)
{
    node* x = new node(INF,-1,l->c + r->c,0,l,r);
    erase(x,INF);
    rez = x;
}

void print(node* nod)
{
    update(nod);
    if(nod==nul)
        return;
    print(nod->l);
    fout<<nod->v<<' ';
    print(nod->r);
}
void reverse(node*& nod,int l,int r)
{

    split(nod,l-1,a,b);
    split(b,r-l+1,c,d);
    c->rev=1;
    update(c);
    merge(c,d,b);
    merge(a,b,nod);
}
void del(node*& nod,int l,int r)
{
    split(nod,l-1,a,b);
    split(b,r-l+1,c,d);
    merge(a,d,nod);
}
int acces(node* nod,int poz)
{
    if(nod->l->c + 1 == poz)
        return nod->v;
    if(nod->l->c + 1 > poz)
        return acces(nod->l,poz);
    return acces(nod->r,poz - nod->l->c - 1);
}






int main()
{
    srand(time(0));
    root = nul = new node();
   // 2 1 3 4
    int n,q;
    fin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        char op;
        fin>>op;
        if(op=='I')
        {
            int a,b;
            fin>>a>>b;
            insert(root,a,new node(b,rand(),1,0,nul,nul));
        }
        else if (op=='A')
        {
            int p;
            fin>>p;
            fout<<acces(root,p)<<'\n';
        }
        else if(op=='R')
        {
            int st,dr;
            fin>>st>>dr;
            reverse(root,st,dr);
        }
        else if(op=='D')
        {
            int st,dr;
            fin>>st>>dr;
            del(root,st,dr);
        }
    }
    print(root);
}