Cod sursa(job #1607921)

Utilizator heracleRadu Muntean heracle Data 21 februarie 2016 18:34:47
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.38 kb
#include <cstdio>
#include <cstring>
#include <random>

FILE* in=fopen("secv8.in","r");
FILE* out=fopen("secv8.out","w");


///parsare------------------------------------------------

const int SBUF=4096;
char BUF[SBUF];
int pbuf=SBUF;

char BUFO[SBUF];
int pbufo=0;

void add_char(char x)
{
    BUFO[pbufo++]=x;
    if(pbufo==SBUF)
    {
        fwrite(BUFO,SBUF,1,out);
        memset(BUFO,0,sizeof BUFO);
        pbufo=0;
    }
}

void back(long long x)
{
    if(x==0)
        return;
    back(x/10);
    add_char(x%10+'0');
}

void add_block(long long x)
{
	if(x<0)
{
	add_char('-');
	x=-x;
}
    back(x);
    if(x==0)
        add_char('0');
    add_char(' ');
}

void jibra()
{
  fprintf(out,"%s",BUFO);
}


bool digit[200];

void jibril()
{
    for(int i='0'; i<='9'; i++)
        digit[i]=1;
    digit['-']=1;

}

char get_char()
{
    if(pbuf==SBUF)
    {
        pbuf=0;
        fread(BUF,SBUF,1,in);
    }
    return BUF[pbuf++];
}

long long get_int()
{
    char x;

    x=get_char();

    long long rez=0;

    while(!digit[x])
        x=get_char();

    long long b=1;
    if(x=='-')
    {
        b=-1;
        x=get_char();
    }


    while(digit[x])
    {
        rez=rez*10+x-'0';
        x=get_char();
    }

    return rez*b;
}
///parsare-----------------------------------------------

int max(const int &a, const int &b)
{
	return a>b?a:b;
}

int min(const int &a, const int &b)
{
	return a<b?a:b;
}
struct treap
{
	int nrel;
	bool inv;
	int my;
	int prio;

	treap *st,*dr;

	treap(const int &act, const int &pr)
	{
		prio=pr;
		nrel=1;
		my=act;
		inv=0;
		st=NULL;
		dr=NULL;
	}
} *rad;

int numar(treap *act)
{
	if(act==NULL)
		return 0;
	return act->nrel;
}

void rezolv(treap *act)
{
	if(act->st)
		act->st->inv=!act->st->inv;
	if(act->dr)
		act->dr->inv=!act->dr->inv;

	act->inv=0;
	treap *ax=act->st;
	act->st=act->dr;
	act->dr=ax;
}

treap *rotate_right(treap *act)
{
	treap *newrad=act->st;

	if(newrad->inv==1)
		rezolv(newrad);

	act->st=newrad->dr;
	newrad->dr=act;

	act->nrel=numar(act->st)+numar(act->dr)+1;
	newrad->nrel=numar(newrad->st)+numar(newrad->dr)+1;

	return newrad;
}



treap *rotate_left(treap *act)
{
	treap *newrad=act->dr;

	if(newrad->inv==1)
		rezolv(newrad);
	act->dr=newrad->st;
	newrad->st=act;

	act->nrel=numar(act->st)+numar(act->dr)+1;
	newrad->nrel=numar(newrad->st)+numar(newrad->dr)+1;

	return newrad;
}



treap *insert(treap *act, int poz, int val)
{

	if(act==NULL)
	{
		act=new treap(val, (rand()&((1<<15)-1)*(1<<15)) +(rand()&((1<<15)-1)) );


		if(val==-1)
			act->prio=(1<<30)+20;

		return act;
	}
	if(act->inv==1)
	{
		rezolv(act);
	}

	int nst,ndr;

	if(act->st!=NULL)
		nst=act->st->nrel;
	else
		nst=0;

	if(act->dr!=NULL)
		ndr=act->dr->nrel;
	else
		ndr=0;

	if(nst+1>=poz)
	{
		act->st=insert(act->st,poz,val);

		act->nrel=numar(act->st)+numar(act->dr)+1;

		if(act->st->prio > act->prio)
			act=rotate_right(act);
	}
	else
	{
		act->dr=insert(act->dr,poz-nst-1,val);

		act->nrel=numar(act->st)+numar(act->dr)+1;

		if(act->dr->prio > act->prio)
			act=rotate_left(act);
	}
	return act;
}

int ask(treap *act, int poz)
{
	if(act->inv==1)
	{
		rezolv(act);
	}
	int nst,nrd;

	nst=numar(act->st);
	nrd=numar(act->dr);

	if(poz<=nst)
		return ask(act->st,poz);
	if(poz==nst+1)
		return act->my;
	return ask(act->dr,poz-nst-1);
}

treap *del(treap *act)
{
	if(act->st==NULL && act->dr==NULL)
	{
		delete(act);
		return NULL;
	}
	else if(act->st==NULL)
	{
		act=rotate_left(act);
		act->st=del(act->st);
	}
	else if(act->dr==NULL)
	{
		act=rotate_right(act);
		act->dr=del(act->dr);
	}
	else
	{
		if(act->st->prio> act->dr->prio)
		{
			act=rotate_right(act);
			act->dr=del(act->dr);
		}
		else
		{
			act=rotate_left(act);
			act->st=del(act->st);
		}
	}
	act->nrel=numar(act->st)+numar(act->dr)+1;
	return act;
}

treap *sterg(treap *act, int poz)
{
	if(act->inv==1)
	{
		rezolv(act);
	}
	int nst,nrd;

	nst=numar(act->st);
	nrd=numar(act->dr);

	if(poz<=nst)
	{
		act->st=sterg(act->st,poz);
		act->nrel--;
	}
	else if(poz>nst+1)
	{
		act->dr=sterg(act->dr,poz-nst-1);
		act->nrel--;
	}
	if(poz==nst+1)
	{
		treap *fst=del(act);

		act=fst;
	}
	act->nrel=numar(act->st)+numar(act->dr)+1;
	return act;
}

void reverse(int a, int b)
{
	treap *auxrad=rad,*auxrad2;
	treap *rad1,*rad2,*rad3;

	auxrad=insert(auxrad,b+1,-1);
	rad1=auxrad->st;
	rad3=auxrad->dr;

	auxrad2=rad1;

	auxrad2=insert(auxrad2,a, -1);
	rad1=auxrad2->st;
	rad2=auxrad2->dr;

	rad2->inv=!rad2->inv;
	auxrad2=sterg(auxrad2,a);

	auxrad->st=auxrad2;

	auxrad=sterg(auxrad,b+1);

	rad=auxrad;
}

void delet(int a, int b)
{
	treap *auxrad=rad,*auxrad2;
	treap *rad1,*rad2,*rad3;

	auxrad=insert(auxrad,b+1,-1);
	rad1=auxrad->st;
	rad3=auxrad->dr;

	auxrad2=rad1;

	auxrad2=insert(auxrad2,a, -1);
	rad1=auxrad2->st;
	rad2=auxrad2->dr;

	auxrad->st=rad1;
	auxrad=sterg(auxrad,a);
	rad=auxrad;
}

void dfs(treap *act)
{
	if(act==NULL)
		return;
	if(act->inv==1)
	{
		rezolv(act);
	}
	dfs(act->st);
	fprintf(out,"%d ",act->my);
	dfs(act->dr);
}

int main()
{
	jibril();
    rad=NULL;

    int trash,n;

    n=get_int();
    trash=get_int();

    char x;
    int k,e;

    for(int i=1; i<=n; i++)
    {
		x=get_char();

		if(x=='I')
		{
			k=get_int();
			e=get_int();
			rad=insert(rad,k,e);
		}
		else if(x=='A')
		{
			k=get_int();

			e=ask(rad,k);
			fprintf(out,"%d\n",e);
		}
		else if(x=='R')
		{
			k=get_int();
			e=get_int();
			reverse(k,e);
		}
		else if(x=='D')
		{
			k=get_int();
			e=get_int();
			delet(k,e);
		}
    }

    dfs(rad);

    return 0;
}