Cod sursa(job #461956)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 9 iunie 2010 13:33:21
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include<fstream.h>
#include<algorithm>
#include<iostream>

using namespace std;

#define MIN(a , b) (a < b ? a: b)

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

int q,n,op[1000000],v[1000000],s,maxa[1000000],mina[1000000],Min[1000000],op1[100000],lg,sw[1000000];


ofstream g("zeap.out");

void sterge (int st, int dr, int poz, int k)
{
	int i,nr1=-1, nr2;
	Min[1]=10000000;
	for (i=1;i<=n;i++)
		if (sw[i]==1)
			if (nr1==-1)
			{
				nr1=v[i];
				mina[1]=nr1;
			}
			else
			{
				nr2=nr1;
				nr1=v[i];
				if (Min[1]>nr1-nr2)
					Min[1]=nr1-nr2;
			}
	maxa[1]=nr1;
}

void insert (int st, int dr, int poz, int k)
{
	int i,nr1=-1, nr2;
	Min[1]=10000000;
	for (i=1;i<=n;i++)
		if (sw[i]==1)
			if (nr1==-1)
			{
				nr1=v[i];
				mina[1]=nr1;
			}
			else
			{
				nr2=nr1;
				nr1=v[i];
				if (Min[1]>nr1-nr2)
					Min[1]=nr1-nr2;
			}
	maxa[1]=nr1;
}

void solve ()
{
	int i,j,p,s1;
	for (i=1;i<=q;i++)
	{
		if (op[i]==1)
		{
			p=lg;s1=0;
			for (;p;p>>=1)
				if (s1+p<=n && v[s1+p]<=op1[i])
					s1+=p;
			if (sw[s1]==0)
			{
				sw[s1]=1;
				insert(1,n,s1,1);
			}
		}
		if (op[i]==2)
		{
			p=lg;s1=0;
			
			for (;p;p>>=1)
				if (s1+p<=n && v[s1+p]<=op1[i])
					s1+=p;
				
			if (sw[s1]==1 && v[s1]==op1[i])
			{
				sw[s1]=0;
				sterge (1,n,s1,1);
			}
			else
				g<<"-1\n";
		}
		if (op[i]==3)
		{
			p=lg;s1=0;
			for (;p;p>>=1)
				if (s1+p<=n &&v[s1+p]<=op1[i])
					s1+=p;
				
			if (sw[s1]==1 && v[s1]==op1[i])
				g<<"1\n";
			else
				g<<"0\n";
		}
		if (op[i]==4)
			g<<maxa[1]-mina[1]<<'\n';
		if (op[i]==5)
			g<<Min[1]<<'\n';
	}
}

void citire ()
{
	char ch[15000],s[15000];

	int i,nr;
	ifstream f("zeap.in");
	q=0;
	n=0;
	while (f.get(s,15))
	{
		f.get();
		i=0;
		while (s[i]!=' ' && s[i]!=0)
			ch[i++]=s[i];
		ch[i]=0;
		if (i==1)
		{
			q++;
			nr=0;
			++i;
			while (s[i]>='0'  && s[i]<='9')
				nr=nr*10+(s[i++]-'0');
			if (ch[0]=='I')
			{
				op[q]=1;
				op1[q]=nr;
				v[++n]=nr;
			}
			if (ch[0]=='S')
			{
				op[q]=2;
				op1[q]=nr;
			}
			if (ch[0]=='C')
			{
				op[q]=3;
				op1[q]=nr;
			}
		}
		else
		{
			if (ch[1]=='A')
				op[++q]=4;
			else
				op[++q]=5;
		}
	}
	f.close();
}

int main()
{
	int i,j;
	s=0;
	citire ();
	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;
	solve ();
	return 0;
}