Cod sursa(job #2128654)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 11 februarie 2018 21:55:14
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <cstdio>
#define M 999863
using namespace std;

struct li
{
    int val;
    li *n;
}v[999863];


void addelem(int x)
{
    int m;
    m = x % M;
    if(!v[m].val)
        v[m].val = x;
    else
    {
        int ok = 0;
        li *p = &v[m];
        while(p->n)
        {
            if((p)->val == x){ok=1;break;}
           (p) = (p)->n;
        }
        if(!ok)
        {
            (p->n)= new li;
            (p->n)->val = x;
            (p->n)->n = NULL;
        }
    }
}

int caut(int x)
{
    int m=x%M;
    li *p = &v[m];
    while(p)
    {
        if(x == p->val)return 1;
        p=p->n;
    }
    return 0;
}

void sterge(int x)
{
      int m=x%M, ok=0;

    if(v[m].val != x)
    {li *p = &v[m], *q;
    while(p)
    {

        if(x == p->val){ if(p->n)q->n=p->n;else q->n=NULL;break;}
        q = p;
        p=p->n;
    }
    }
    else
    {
        if(v[m].n)
        {
        v[m].val = v[m].n->val;
        if(v[m].n)
        v[m].n = v[m].n->n;
        else v[m].n=NULL;
        }
        else {v[m].val=0;v[m].n=NULL;}
    }


}

int main()
{
    freopen("hashuri.in","r",stdin);
    freopen("hashuri.out","w",stdout);
    int n,i,a,b;
    scanf("%d", &n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d", &a, &b);
        if(a==1)
        {
    addelem(b);
        }
        else
        if(a==2)
        {
        sterge(b);
        }
        else
        {
        printf("%d\n", caut(b));
        }
    }


    return 0;
}