Cod sursa(job #462313)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 10 iunie 2010 13:22:48
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.83 kb
#include<iostream>
#include<fstream>
#include<algorithm>

using namespace std;

inline int cmp (int a, int b ) { return a<b ; }


int v[400000],op[400000],val[400000],maxa[1100000],mina[1100000],Min[1100000],n,q,sw[400000],lg,cont;



void sterge  (int st, int dr, int poz, int k)
{
	if (st==dr)
	{
		mina[k]=maxa[k]=-1;
		Min[k]=-1;
		return ;
	}
	
	int mij= (st+dr)/2;
	
	if (poz<=mij)
		sterge (st,mij,poz,2*k);
	else
		sterge (mij+1,dr,poz,2*k+1);
	
	mina[k]=mina[2*k];
	if (mina[k]==-1)
		mina[k]=mina[2*k+1];
	maxa[k]=maxa[2*k+1];
	if (maxa[k]==-1)
		maxa[k]=maxa[2*k];
	
	Min[k]=-1;
	if (maxa[2*k]!=-1 && mina[2*k+1]!=-1)
		Min[k]=mina[2*k+1]-maxa[2*k];
	if (Min[k]==-1 || Min[2*k]<Min[k] && Min[2*k]!=-1)
		Min[k]=Min[2*k];
	if (Min[k]==-1 || Min[2*k+1]<Min[k] && Min[2*k+1]!=-1)
		Min[k]=Min[2*k+1];

}
void insert (int st, int dr , int poz, int k)
{
	if (st==dr)
	{
		mina[k]=maxa[k]=v[poz];
		Min[k]=-1;
		return ;
	}
	
	int mij= (st+dr)/2;
	
	if (poz<=mij)
		insert (st,mij,poz,2*k);
	else
		insert (mij+1,dr,poz,2*k+1);
	
	mina[k]=mina[2*k];
	if (mina[k]==-1)
		mina[k]=mina[2*k+1];
	maxa[k]=maxa[2*k+1];
	if (maxa[k]==-1)
		maxa[k]=maxa[2*k];
	
	Min[k]=-1;
	if (maxa[2*k]!=-1 && mina[2*k+1]!=-1)
		Min[k]=mina[2*k+1]-maxa[2*k];
	if (Min[k]==-1 || Min[2*k]<Min[k] && Min[2*k]!=-1)
		Min[k]=Min[2*k];
	if (Min[k]==-1 || Min[2*k+1]<Min[k] && Min[2*k+1]!=-1)
		Min[k]=Min[2*k+1];

}
/*void insert (int poz)
{
	s=0;
	for (i=poz;i;i-=(i^(i&(i-1))))
		s+=aib[i];
	s1=0;sum=0;
	
	if (s>1)
	{
	for (p=lg;p;p>>=1)
		if (s1+p<=n && sum+aib[p]<s-1)
		{
			s1+=p;
			sum+=aib[p];
		}
	s1++;
	
	h[poz1[s1]]=h[nr--];
	poz1[poz2[nr+1]]=poz1[s1];
	poz2[poz1[s1]]=poz2[nr+1];
	poz1[s1]=0;
	coboara (poz1[s1]);
	
	poz1[s1]=++nr;
	h[nr]=v[s]-v[s1];
	poz2[nr]=s1;
	urca ();
	}
	
	if (s<cont)
	{
		for (p=lg;p;p>>=1)
		if (s1+p<=n && sum+aib[p]<s+1)
		{
			s1+=p;
			sum+=aib[p];
		}
		s1++;
		
		poz1[s1]=++nr;
		h[nr]=v[s]-v[s1];
		poz2[nr]=s1;
		urca ();
	}
	
	
	
}	*/

void solve ()
{
	int s,p,i;
	ofstream g("zeap.out");
	for (i=1;i<=q;i++)
	{
		s=0;
		if (op[i]==1)
		{
			p=lg;
			for (;p;p>>=1)
				if (p+s<=n && v[s+p]<=val[i])
					s+=p;
			if (sw[s]==0)
			{
				sw[s]=1;
				insert (1,n,s,1);
				++cont;
			}
		}
		
		if (op[i]==2)
		{
			p=lg;
			for (;p;p>>=1)
				if (p+s<=n && v[s+p]<=val[i])
					s+=p;
				
			if (v[s]==val[i] && sw[s]==1)
			{
				sw[s]=0;
				sterge(1,n,s,1);
				--cont;
			}
			else
				g<<"-1\n";
		}
		if (op[i]==3)
		{
			p=lg;
			for (;p;p>>=1)
				if (p+s<=n && v[s+p]<=val[i])
					s+=p;
			
			if (v[s]==val[i] && sw[s]==1)
				g<<"1\n";
			else
				g<<"0\n";
		}
		if (op[i]==4)
			if (cont>=2)
				g<<maxa[1]-mina[1]<<'\n';
			else
				g<<"-1\n";
			
		
		if (op[i]==5)
			if (cont>=2)
				g<<Min[1]<<'\n';
			else
				g<<"-1\n";
	}
	g.close();
}
void proces ()
{
	int i,j;
	sort (v+1,v+n+1,cmp);
	j=0;
	for (i=1;i<n;i++)
		if (v[i]!=v[i+1])
			v[++j]=v[i];
	v[++j]=v[n];
	n=j;
	
	for (lg=1;lg<=n;lg<<=1);
	lg>>=1;
	
}

void citire ()
{
	int nr;
	ifstream f("zeap.in");
	
	char s[10];
	
	n=0;
	q=0;
	
	while (f>>s)
	{
		if (strlen(s)==1)
		{
			f>>nr;
			if (s[0]=='I')
			{
				v[++n]=nr;
				op[++q]=1;
				val[q]=nr;
			}
			if (s[0]=='S')
			{
				op[++q]=2;
				val[q]=nr;
			}
			if (s[0]=='C')
			{
				op[++q]=3;
				val[q]=nr;
			}
		}
		else
		{
			if (s[1]=='A')
				op[++q]=4;
			else
				op[++q]=5;
		}
	}
	f.close();
}	

void init (int st, int dr, int k)
{
	if (st==dr )
	{
		maxa[k]=mina[k]=Min[k]=-1;
		return;
	}
	
	int mij =(st+dr)/2;
	
	init (st,mij,2*k);
	init (mij+1,dr,2*k+1);
	
	Min[k]=mina[k]=maxa[k]=-1;
}

int main()
{
	citire ();
	proces();
	init(1,n,1);
	solve ();
	return 0;
}