Cod sursa(job #1754792)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 8 septembrie 2016 18:38:02
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<fstream>
using namespace std;
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
int mod=666013,n,i,a,b;
struct nod{
   int inf;
   nod *pred,*urm;
}*p[666014],*u[666014];
void adaug(int ind,int val){
     nod *q;
    if (p[ind]!=0){
     q=new nod;
     q->inf=val;
     q->urm=0;
     q->pred=u[ind];
     u[ind]->urm=q;
     u[ind]=q;
    }
     else{
        q=new nod;
        q->inf=val;
        q->urm=0;
        q->pred=0;
        p[ind]=u[ind]=q;
     }
}
void elim(nod *r){
   nod *w,*q;
   w=r->pred;
   q=r->urm;
   w->urm=q;
   q->pred=w;
}
void del(int ind,int val){
     nod *q;
     if (p[ind]==0 && u[ind]==0) return;
     if (p[ind]==u[ind] && p[ind]->inf==val){
        p[ind]=u[ind]=0;
        return;
     }
     if (p[ind]->inf==val){
        p[ind]=p[ind]->urm;
        p[ind]->pred=0;
        return;
     }
     if (u[ind]->inf==val){
        u[ind]=u[ind]->pred;
        u[ind]->urm=0;
        return;
     }
     q=p[ind];
     while(q!=0){
        if (q->inf==val) break;
        q=q->urm;
     }
     if (q!=0) elim(q);
}
void add(int ind,int val){
    nod *q;
    q=p[ind];
    while(q!=0){
        if (q->inf==val) break;
        q=q->urm;
    }
    if (q==0) adaug(ind,val);
}
int found(int ind,int val){
     nod *q;
     q=p[ind];
     while(q!=0){
        if (q->inf==val) return 1;
        q=q->urm;
     }
     return 0;
}
int main(){
    fin>>n;
    for (i=0;i<=mod-1;i++)
    {
        p[i]=u[i]=0;
    }
    for (i=1;i<=n;i++){
        fin>>a>>b;
        if (a==1) add(b%mod,b);
          else
            if (a==2) del(b%mod,b);
              else
                if (a==3) fout<<found(b%mod,b)<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}