Cod sursa(job #3244894)

Utilizator Luca529Taschina Luca Luca529 Data 26 septembrie 2024 19:01:42
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("secv8.in");
ofstream fout("secv8.out");
int sol;

struct Treap{
int pri, v, la, c;

Treap *st, *dr;
}*treap;

int D(Treap *treap)
{if(treap==NULL)return 0;
 return treap->v;
}

void La(Treap *& treap)
{treap->la%=2;

 if(treap->la==1)
 {if(treap->st!=NULL)treap->st->la+=treap->la;
  if(treap->dr!=NULL)treap->dr->la+=treap->la;

  swap(treap->st, treap->dr);
 }

 treap->la=0;
}

void Split(Treap *treap, Treap *& st, Treap *& dr, int v)
{if(treap==NULL)
 {st=dr=NULL;
  return ;
 }

 if(treap->la%2!=0)La(treap);

 if(D(treap->st)<v)
 {Split(treap->dr, treap->dr, dr, v-D(treap->st)-1);
  st=treap;
 }
 else
 {Split(treap->st, st, treap->st, v);
  dr=treap;
 }

 if(treap!=NULL)treap->v=D(treap->st)+D(treap->dr)+1;
}

void Merge(Treap *& treap, Treap *st, Treap *dr)
{if(st!=NULL)La(st);
 if(dr!=NULL)La(dr);

 if(st==NULL)
 treap=dr;
 else if(dr==NULL)
 treap=st;
 else
 {if(st->pri<dr->pri)
  {Merge(st->dr, st->dr, dr);
   treap=st;
  }
  else
  {Merge(dr->st, st, dr->st);
   treap=dr;
  }
 }

 if(treap!=NULL)treap->v=D(treap->st)+D(treap->dr)+1;
}

void Cauta(Treap *& treap, int v)
{if(treap!=NULL)
 {La(treap);

  if(D(treap->st)==v-1)sol=treap->c;
  else if(D(treap->st)<v)Cauta(treap->dr, v-D(treap->st)-1);
  else Cauta(treap->st, v);

  treap->v=D(treap->st)+D(treap->dr)+1;
 }
}

void DFS(Treap *& treap)
{if(treap!=NULL)
 {La(treap);
  DFS(treap->st);

  fout<<treap->c<<" ";
  DFS(treap->dr);
 }
}

int main()
{   ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n, a, b;
    char oper;
    fin>>n>>a;

    treap=NULL;

    while(n)
    {fin>>oper;

     if(oper=='I')
     {fin>>a>>b;

      Treap *tri1, *tri2, *tri3;
      Split(treap, tri1, tri2, a-1);

      tri3 = new Treap;
      tri3->st=tri3->dr=NULL;
      tri3->pri=rand(), tri3->v=1;
      tri3->la=0, tri3->c=b;

      Merge(treap, tri1, tri3);
      Merge(treap, treap, tri2);
     }
     else if(oper=='R')
     {fin>>a>>b;
      Treap *tri1, *tri2, *tri3, *tri4;

      Split(treap, tri1, tri2, a-1);
      Split(tri2, tri3, tri4, b-a+1);

      tri3->la++;
      Merge(treap, tri1, tri3);
      Merge(treap, treap, tri4);
     }
     else if(oper=='A')
     {fin>>a;

      Cauta(treap, a);
      fout<<sol<<"\n";
     }
     else
     {fin>>a>>b;

      Treap *tri1, *tri2, *tri3, *tri4;

      Split(treap, tri1, tri2, a-1);
      Split(tri2, tri3, tri4, b-a+1);

      Merge(treap, tri1, tri4);
     }

     n--;
    }
    DFS(treap);
    return 0;
}