Cod sursa(job #265206)

Utilizator yonutzTalos Ionut yonutz Data 23 februarie 2009 16:30:33
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>

#define MOD (262144*2)-1
#define Nmax 700000

int next_el = MOD;

struct nod { int nr; char ok; int next; };

nod h[MOD+Nmax];

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;    
}

int main()
{
	freopen("hashuri.in","r",stdin);
	freopen("hashuri.out","w",stdout);

	int t,op,nr;
	
	scanf("%d", &t);
	
	while (t>2)
	{
		scanf("%d%d",&op,&nr);
		if (op == 1) add(nr); else
		if (op == 2) del(nr); else
		printf("%d\n", ok(nr));
		scanf("%d%d",&op,&nr);
		if (op == 1) add(nr); else
		if (op == 2) del(nr); else
		printf("%d\n", ok(nr));
		scanf("%d%d",&op,&nr);
		if (op == 1) add(nr); else
		if (op == 2) del(nr); else
		printf("%d\n", ok(nr));
		t-=3;
	}
	
	while (t--)
	{
		scanf("%d%d",&op,&nr);
		if (op == 1) add(nr); else
		if (op == 2) del(nr); else
		printf("%d\n", ok(nr));
    }
	return 0;
}