Cod sursa(job #39360)

Utilizator pocaituDavid si Goliat pocaitu Data 26 martie 2007 17:45:04
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.59 kb
#include<stdio.h>
#include<fstream.h>
#define nmax 1000000
#define nm 300001
#define cm 14
#define nil -10000
#define infi 10000
inline long minim(long a,long b) {return a<b?a:b;}
inline long maxim(long a,long b) {return a>b?a:b;}
long cautare(long);void add(long,long,long,long,long,long);long inter(long,long,long,long,long);
void refa(long);void merge_sort(long,long);void init();


long A[nm],B[nm],nr[nm],n,val[nmax],s[nmax],d[nmax],max[nmax],min[nmax];

int main()
{long i,d,m,j;
 char c[nm][cm],s[cm];
 freopen("zeap.in","r",stdin);
 freopen("zeap.out","w",stdout);

 //scanf("%d",&m);
 //fgets(c[0],cm,stdin);
 i=1;
 while(fgets(c[i++],cm,stdin));
 m=i-2;


 for(i=1;i<=m;i++)
  if(c[i][0]=='I'||c[i][0]=='S'||c[i][0]=='C')
   {j=2;
	++nr[0];
	while(c[i][j]>='0'&&c[i][j]<='9')
	  nr[nr[0]]=nr[nr[0]]*10+c[i][j++]-'0';
	}
 n=nr[0];
 init();
 memcpy(A,nr,sizeof(A));
 merge_sort(1,n);
 nr[0]=0;
 for(i=1;i<=n;i++)
   {nr[++nr[0]]=A[i];
   while(A[i]==A[i+1]) i++;
   }
 n=nr[0];
 for(i=1;i<=m;i++)
   {//fgets(c,cm,stdin);
	j=0;
	s[0]=0;
	while(c[i][j]!=' ')
	 s[++s[0]]=c[i][j++];
	if(s[1]=='M'&&s[2]=='I')
	   {if(min[1]==nil) printf("-1\n");
	   else
	   printf("%ld\n",min[1]);}

	else
	   if(s[1]=='M'&&s[2]=='A')
		{if(max[1]==nil) printf("-1\n");
		 else
		printf("%ld\n",max[1]);}
	else
	  {d=0;j=2;
	   while(c[i][j]>='0'&&c[i][j]<='9')
		 d=d*10+c[i][j++]-'0';
	   j=cautare(d);
	   if(s[1]=='I')
		 {if(!inter(1,1,n,j,j))
			add(1,1,n,d,j,1);
		  }
	   else if(s[1]=='S')
		 {if(inter(1,1,n,j,j))
		   add(1,1,n,d,j,-1);
		  else printf("-1\n");

		  }
	   else if(inter(1,1,n,j,j)) printf("1\n");
		 else printf("0\n");

	   }
	 }
  fclose(stdout);
  return 0;

  }

void add(long nod,long st,long dr,long h,long a,long sum)
{long b,mij;
 b=a;
 if(a<=st&&b>=dr)
   {val[nod]+=sum;
	if(!val[nod])
	  s[nod]=d[nod]=nil;
	else s[nod]=d[nod]=h;
	refa(nod);
	}
 else
   {mij=(st+dr)/2;
	if(a<=mij)
	  add(nod*2,st,mij,h,b,sum);
	if(b>mij)
	  add(nod*2+1,mij+1,dr,h,b,sum);
	val[nod]+=sum*(b-a+1);
	}

 }
void refa(long nod)
{nod=nod/2;
 while(nod)
  {min[nod]=infi;
   max[nod]=-1;
   if(min[nod*2]) min[nod]=minim(min[nod*2],min[nod]);
   if(min[nod*2+1]) min[nod]=minim(min[nod*2+1],min[nod]);

   if(d[nod*2]!=nil&&s[nod*2+1]!=nil)
	 min[nod]=minim(s[nod*2+1]-d[nod*2],min[nod]);
   if(max[nod*2]) max[nod]=maxim(max[nod*2],max[nod]);
   if(max[nod*2+1]) max[nod]=maxim(max[nod*2+1],max[nod]);

   if(s[nod*2]!=nil&&d[nod*2+1]!=nil)
	 max[nod]=maxim(d[nod*2+1]-s[nod*2],max[nod]);

   if(s[nod*2+1]!=nil)
	 s[nod]=s[nod*2+1];
   if(s[nod*2]!=nil)
	 s[nod]=s[nod*2];
   if(d[nod*2]!=nil)
	 d[nod]=d[nod*2];
   if(d[nod*2+1]!=nil)
	 d[nod]=d[nod*2+1];

   nod/=2;
   }
 }

long inter(long nod,long st,long dr,long a,long b)
{long mij,s=0;

 if(a<=st&&b>=dr)
  return val[nod];
 else
  {mij=(st+dr)/2;
   if(a<=mij) s+=inter(2*nod,st,mij,a,b);
   if(b>mij) s+=inter(2*nod+1,mij+1,dr,a,b);
   return s;
   }
 }

long cautare(long x)
{long ls,ld,mij;
 ls=1;ld=n;
 while(ls<=ld)
  {mij=(ls+ld)/2;
   if(nr[mij]>x)
	 ld=mij-1;
   else if(nr[mij]<x)
	 ls=mij+1;
   else return mij;
   }
 return mij;
 }
void merge_sort(long l,long r)
{
	int m = (l + r) >> 1, i, j, k;
	if (l == r) return;
	merge_sort(l, m);
	merge_sort(m + 1, r);
	for (i=l, j=m+1, k=l; i<=m || j<=r; )
		if (j > r || (i <= m && A[i] < A[j]))
			B[k++] = A[i++];
		else
			B[k++] = A[j++];
	for (k = l; k <= r; k++) A[k] = B[k];
}
void init()
{long i;
 for(i=0;i<nmax;i++)
  s[i]=d[i]=nil;

 }