Cod sursa(job #2028)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 15 decembrie 2006 18:12:52
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.4 kb
#include<stdio.h>
#define fin "zeap.in"
#define fout "zeap.out"
#define NMAX 1000005
#define T 1000000001
long e,a[NMAX],v[NMAX],n,p[NMAX][2];
long segm[NMAX][4];
FILE *in,*out;

long max(long a,long b) { (a<b)?(a=b):(a); return a; }
long min(long a,long b) { (a>b)?(a=b):(a); return a; }

void qsort(long st,long dr) {
 long m,i,j,aux;
  m=a[(st+dr)/2];
  i=st; j=dr;
  do {
   while (a[i]<m) i++;
   while (a[j]>m) j--;
   if (i<=j) { aux=a[i]; a[i]=a[j]; a[j]=aux; i++; j--; }
   }while (i<j);
  if (i<dr) qsort(i,dr);
  if (j>st) qsort(st,j); 
 }

void insert(long nod,long st,long dr,long val) {
long m; 
 if (st==dr) { segm[nod][0]=segm[nod][1]=val; segm[nod][2]=T; }     
 else {
  m=(st+dr)/2;
  if (val<=v[m]) insert(2*nod,st,m,val);
  if (val>v[m]) insert(2*nod+1,m+1,dr,val);
  
  segm[nod][0]=min(segm[2*nod][0],segm[2*nod+1][0]);
  segm[nod][1]=max(segm[2*nod][1],segm[2*nod+1][1]);
  
  if (!segm[2*nod][0]) segm[nod][0]=segm[2*nod+1][0];
  if (!segm[2*nod+1][0]) segm[nod][0]=segm[2*nod][0];
  
  if (!segm[2*nod][1]) segm[nod][1]=segm[2*nod+1][1];
  if (!segm[2*nod+1][1]) segm[nod][1]=segm[2*nod][1];
  
  segm[nod][2]=T;
  if (segm[2*nod][2]) segm[nod][2]=segm[2*nod][2];
  if (segm[2*nod+1][2]) segm[nod][2]=min(segm[nod][2],segm[2*nod+1][2]);
  if (segm[2*nod][0] && segm[2*nod+1][0]) 
   segm[nod][2]=min(segm[nod][2],segm[2*nod+1][0]-segm[2*nod][0]);
  if (segm[2*nod][0] && segm[2*nod+1][1]) 
   segm[nod][2]=min(segm[nod][2],segm[2*nod+1][1]-segm[2*nod][0]);
  if (segm[2*nod][1] && segm[2*nod+1][0]) 
   segm[nod][2]=min(segm[nod][2],segm[2*nod+1][0]-segm[2*nod][1]);
  if (segm[2*nod][1] && segm[2*nod+1][1]) 
   segm[nod][2]=min(segm[nod][2],segm[2*nod+1][1]-segm[2*nod][1]);
  
  }
}

void sters(long nod,long st,long dr,long val) {
long m; 
 if (st==dr) { 
  if(!segm[nod][0]) e=0; 
  segm[nod][0]=segm[nod][1]=0;
  segm[nod][2]=T; 
  }     
 else {
  m=(st+dr)/2;
  
  if (val<=v[m]) sters(2*nod,st,m,val);
  if (val>v[m])  sters(2*nod+1,m+1,dr,val);
  segm[nod][0]=min(segm[2*nod][0],segm[2*nod+1][0]);
  segm[nod][1]=max(segm[2*nod][1],segm[2*nod+1][1]);
  
  if (!segm[2*nod][0]) segm[nod][0]=segm[2*nod+1][0];
  if (!segm[2*nod+1][0]) segm[nod][0]=segm[2*nod][0];
  
  if (!segm[2*nod][1]) segm[nod][1]=segm[2*nod+1][1];
  if (!segm[2*nod+1][1]) segm[nod][1]=segm[2*nod][1];
  
  segm[nod][2]=T;
  if (segm[2*nod][2]) segm[nod][2]=segm[2*nod][2];
  if (segm[2*nod+1][2]) segm[nod][2]=min(segm[nod][2],segm[2*nod+1][2]);
  if (segm[2*nod][0] && segm[2*nod+1][0]) 
   segm[nod][2]=min(segm[nod][2],segm[2*nod+1][0]-segm[2*nod][0]);
  if (segm[2*nod][0] && segm[2*nod+1][1]) 
   segm[nod][2]=min(segm[nod][2],segm[2*nod+1][1]-segm[2*nod][0]);
  if (segm[2*nod][1] && segm[2*nod+1][0]) 
   segm[nod][2]=min(segm[nod][2],segm[2*nod+1][0]-segm[2*nod][1]);
  if (segm[2*nod][1] && segm[2*nod+1][1]) 
   segm[nod][2]=min(segm[nod][2],segm[2*nod+1][1]-segm[2*nod][1]);
  }
}

long cauta(long nod,long st,long dr,long val) {
long m; 
 if (st==dr) { 
   if (segm[nod][0]) return 1;
   else return 0; }     
 else {
  m=(st+dr)/2;
  if (val<=v[m]) return cauta(2*nod,st,m,val);
  if (val>v[m])  return cauta(2*nod+1,m+1,dr,val);
  }
}
                  
int main() {
char c;
long i,nr; 
 in=fopen(fin,"r"); out=fopen(fout,"w");
 c=fgetc(in);
 while (c!=EOF) {
  if (c=='M') { 
   c=fgetc(in); 
   if (c=='A') p[++n][0]=1; //max
   else p[++n][0]=2;        //min
   while (c!='\n' && c!=EOF) c=fgetc(in);
   }
  else {
   if (c=='I') p[++n][0]=3; //insert
   if (c=='S') p[++n][0]=4; //sterge
   if (c=='C') p[++n][0]=5; //cauta
   while (c<'0' || c>'9') c=fgetc(in);
   nr=0;
   while (c!='\n' && c!=EOF) { nr=nr*10+(c-'0'); c=fgetc(in); }
   p[n][1]=nr;
   a[++a[0]]=nr;
   }
  c=fgetc(in);
  }
 qsort(1,a[0]); 
 for (i=1;i<=a[0];i++) 
  if (a[i]!=a[i+1]) v[++v[0]]=a[i]; 
 for (i=1;i<=n;i++) {
  if (p[i][0]==1) { 
   if (segm[1][0]==segm[1][1]) fprintf(out,"-1\n");
   else fprintf(out,"%ld\n",segm[1][1]-segm[1][0]); }
  if (p[i][0]==2) {
   if (segm[1][2]==T || !segm[1][2]) fprintf(out,"-1\n");
   else fprintf(out,"%ld\n",segm[1][2]); }
  if (p[i][0]==3) insert(1,1,v[0],p[i][1]);
  if (p[i][0]==4) { 
   e=1; sters(1,1,v[0],p[i][1]);
   if (!e) fprintf(out,"-1\n");
   }
  if (p[i][0]==5) if (!cauta(1,1,v[0],p[i][1])) fprintf(out,"0\n");
                  else fprintf(out,"1\n");
  } 
 fclose(in); fclose(out);
 return 0;
}