Cod sursa(job #1223801)

Utilizator ion824Ion Ureche ion824 Data 28 august 2014 21:23:43
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.07 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int NM = 1200000;
const int NUM = 300000;
const int INF = 0x3f3f3f3f;
const int MOD = 666013;
int mx[NM], mn[NM], Dm[NM];
int st[NUM+5], K, Val1, Val2, poz, PPZ;
char s[20];

typedef struct lnod{
	int vf,poz;
	lnod *next;
}*Nod;

Nod h[MOD];

void add(Nod &q, int vf, int poz){
	Nod p = new lnod;
	p->vf = vf;
	p->poz = poz;
	p->next = q;
	q = p;
}

bool find(int val){
	for(Nod p = h[val % MOD]; p; p=p->next)
	  if(p->vf == val) return 1;
	return 0;
}

int deleter(int val){
	int x = val % MOD;
	Nod prec;
	for(Nod p = h[x],prec=0; p; prec=p, p=p->next)
	  if(p->vf == val)
	  {
	  	if(h[x] == p) h[x] = h[x]->next;
	  	else
	  	if(p->next == NULL) prec->next = NULL;
	  	else
	  	prec->next = p -> next;
	  	return p->poz;
	  }
	return 0;
}

int abs2(int x) { return (x<0) ? -x : x; }

void build(int nod, int l, int r){
	if(l == r)
	{
		mn[nod] = Dm[nod] = INF;
		mx[nod] = -INF;
		return ;
	}
	int div = (l+r) / 2;
	
	build(2*nod,l,div);
	build(2*nod+1,div+1,r);
	
	Dm[nod] = min(Dm[2*nod], Dm[2*nod+1]);
	if(mx[2*nod] != -INF && mx[2*nod+1] != -INF) Dm[nod] = min(Dm[nod], abs2(mx[2*nod] - mx[2*nod+1]));
	if(mn[2*nod] !=  INF && mn[2*nod+1] !=  INF) Dm[nod] = min(Dm[nod], abs2(mn[2*nod] - mn[2*nod+1])); 
	
	mx[nod] = max(mx[2*nod], mx[2*nod+1]);
	mn[nod] = min(mn[2*nod], mn[2*nod+1]);
}

void update(int nod, int l, int r){
	
	if(l == r)
	{
		mn[nod] = Val1;
		mx[nod] = Val2;
		return ;
	}
	
	int div = (l+r) / 2;
	
	if(poz <= div) update(2*nod, l, div);
	else update(2*nod+1, div+1, r);
	
	Dm[nod] = min(Dm[2*nod], Dm[2*nod+1]);
	if(mx[2*nod] != -INF && mx[2*nod+1] != -INF) Dm[nod] = min(Dm[nod], abs2(mx[2*nod] - mx[2*nod+1]));
	if(mn[2*nod] !=  INF && mn[2*nod+1] !=  INF) Dm[nod] = min(Dm[nod], abs2(mn[2*nod] - mn[2*nod+1])); 
	
	mx[nod] = max(mx[2*nod], mx[2*nod+1]);
	mn[nod] = min(mn[2*nod], mn[2*nod+1]);	
}

int main(){
	freopen("zeap.in","r",stdin);
	freopen("zeap.out","w",stdout);	
	int i,l,x=0,nr=0;
	
	build(1,1,NUM);
	
	for(i=NUM;i>0;--i) st[NUM-i+1] = i;
	K = NUM;
	
	while(gets(s))
	{
		l = strlen(s);
		if(s[0] == 'I' || s[0] == 'S' || s[0] == 'C')
		{
			i = 2;
			x = 0;
			while(i<l && s[i] >='0' && s[i]<='9') x=(x*10)+(s[i++]-'0');
		}
		if(s[0] == 'I')
		{
			if(!find(x))
			{
				add(h[x%MOD],x,st[K]);
				Val1 = Val2 = x;
				poz = st[K];
				update(1,1,NUM);
				-- K;
				nr ++;	
			}
		}
		else
		if(s[0] == 'S')
		{
			if(find(x))
			{
				PPZ = deleter(x);
				st[++K] = PPZ;
				Val1 = INF;
				Val2 = - INF;
				poz = PPZ;
				update(1,1,NUM);
				nr --;
			}
			else
			printf("-1\n");
		}
		else
		if(s[0] == 'C')
		{
			if(find(x)) printf("1\n");
			else printf("0\n");
		}
		else
		if(s[1] == 'A')
		{
			if(nr > 1)
			{
				printf("%d\n",mx[1] - mn[1]);
			}
			else printf("-1\n");
		}
		else
		if(s[1] == 'I')
		{
			if(nr > 1)
			{
				printf("%d\n",Dm[1]);
			}
			else printf("-1\n");
		}
		memset(s,0,sizeof(s));
	}	
	
	return 0;
}