Cod sursa(job #257485)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 13 februarie 2009 13:49:06
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>

#define MOD (262144*2)-1
#define Nmax 700000
#define IN "hashuri.in"
#define OUT "hashuri.out"

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

int next_el=MOD;
struct nod 
{
 int nr;
 char ok;
 int next;
}h[MOD+Nmax];

inline void add(int nr);
inline void del(int nr);
inline int ok(int nr);

int main()
{
 int t,op,nr;
	
 fscanf(fin,"%d",&t);
	
 while(t>2)
 {
  fscanf(fin,"%d%d",&op,&nr);
  
  if(op==1)
   add(nr);
  else
   if(op==2)
    del(nr);
   else
	fprintf(fout,"%d\n", ok(nr));
	
 fscanf(fin,"%d%d",&op,&nr);
 
 if(op==1)
  add(nr);
 else
  if(op==2)
   del(nr);
  else
	fprintf(fout,"%d\n", ok(nr));
	
 fscanf(fin,"%d%d",&op,&nr);
 
 if(op==1)
  add(nr);
 else
  if(op==2)
   del(nr);
  else
   fprintf(fout,"%d\n", ok(nr));
   
  t-=3;
 }
	
 while (t--)
 {
  fscanf(fin,"%d%d",&op,&nr);
  
  if(op==1)
   add(nr);
  else
   if(op==2)
    del(nr);
   else
	fprintf(fout,"%d\n", ok(nr));
 }
 fclose(fin);
 fclose(fout);
 return 0;
}

inline void add(int nr)
{
 char ok=0;
 int it;
 
 for(it=nr&MOD;;it=h[it].next)
  if (h[it].nr==nr)
  {
   ok=1;
   h[it].ok=1;
   break;
  }
  else
   if(h[it].next==0)
    break; 
    
  if(ok==0)
  {
   h[it].next=next_el++;
   it=h[it].next;
   h[it].nr=nr;
   h[it].ok = 1;
  }    
}

inline void del(int nr)
{
 for(int it=nr&MOD;it;it=h[it].next)
  if(h[it].nr==nr)
   h[it].ok=0;
}

inline int ok(int nr)
{
 for(int it=nr&MOD;it;it=h[it].next)
  if(h[it].nr==nr && h[it].ok==1)
   return 1;
 return 0;    
}