Cod sursa(job #1223820)

Utilizator ion824Ion Ureche ion824 Data 28 august 2014 22:20:58
Problema Zeap Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 3.52 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;

struct quad{
	char T;
	int val,index,poz;
}query[NUM+5];

bool cmp(const quad &a, const quad &b){
	return a.index < b.index;
}

bool cmp2(const quad &a, const quad &b){
	if(a.T != b.T) return a.T < b.T;
	return a.val < b.val;
}

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;

	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(mn[2*nod] !=  INF && mn[2*nod+1] !=  INF) Dm[nod] = min(Dm[nod], abs2(mx[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(mn[2*nod] !=  INF && mn[2*nod+1] !=  INF) Dm[nod] = min(Dm[nod], abs2(mx[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,x=0,nr=0,M;
	
	build(1,1,NUM);
	
	for(i=NUM;i>0;--i) st[NUM-i+1] = i;
	K = NUM;
	
	i = 0;
	while(scanf("%s",s) != EOF)
	{
		++i;
		if(s[0] == 'I' || s[0] == 'S' || s[0] == 'C')
		{
			if(s[0] == 'I') query[i].T = 'A'; 
			if(s[0] == 'S') query[i].T = 'S';
			if(s[0] == 'C') query[i].T = 'C';
			scanf("%d",&x);
			query[i].val = x;
		}
		else
		{
			if(s[1] == 'A') query[i].T = 'X';
			if(s[1] == 'I') query[i].T = 'N';
		}				
		query[i].index = i;
	}
	
	M = i;
	sort(query+1, query+i+1, cmp2);
	
	for(i=1; i<=M && query[i].T == 'A'; ++i) 
	{
		query[i].poz = i;
	}
	
	sort(query+1, query+M+1, cmp);
	  
	for(i=1;i<=M;++i)
	{
		if(query[i].T == 'A')
		{
			x = query[i].val;
			poz = query[i].poz;
			if(!find(x))
			{
				add(h[x%MOD],x, poz);
				Val1 = Val2 = x;
				update(1,1,NUM);
				nr ++;	
			}
		}
		else
		if(query[i].T == 'S')
		{
			x = query[i].val;
			if(find(x))
			{
				poz  = deleter(x);		
				Val1 = INF;
				Val2 = - INF;
				update(1,1,NUM);
				nr --;
			}
			else
			printf("-1\n");
		}
		else
		if(query[i].T == 'C')
		{
			x = query[i].val;
			if(find(x)) printf("1\n");
			else printf("0\n");
		}
		else
		if(query[i].T == 'X')
		{
			if(nr > 1)
			{
				printf("%d\n",mx[1] - mn[1]);
			}
			else printf("-1\n");
		}
		else
		{
			if(nr > 1)
			{
				printf("%d\n",Dm[1]);
			}
			else printf("-1\n");
		}
		memset(s,0,sizeof(s));
	}	
	
	return 0;
}