Cod sursa(job #2620785)

Utilizator pascustefanPascu Stefan Liviu pascustefan Data 29 mai 2020 17:46:41
Problema Hashuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <fstream>
//#include <algorithm>

using namespace std;
#define prim 666013

struct node {
    int val;
    node *next, *prev;
};

struct Deque {
    node *p, *u;
};

//int n, op, x;
Deque H[666015];

//void insereaza(lista& L, const int& x)
void Insert(Deque& deq, int& x) {
    node *aux;
    aux = new node;

    aux->val = x;
    aux->next = NULL;
    aux->prev = deq.u;
    if(deq.p == NULL) {
        deq.p = aux;
        deq.u = aux;
        aux = NULL;
    } else {
        deq.u->next = aux;
        deq.u = aux;
    }
}

//void Delete(Deque& deq, const int& x) {
void Delete(Deque& deq, int& x) {
    if(deq.p != NULL && deq.p->val == x) {
        if(deq.p == deq.u) {
            delete deq.p;
            deq.p = NULL;
            deq.u = deq.p;
        } else {
            deq.p = deq.p->next;
            delete deq.p->prev;
            deq.p->prev = NULL;
        }
        return;
    }

    if(deq.u != NULL && deq.u->val == x) {
        deq.u = deq.u->prev;
        delete deq.u->next;
        deq.u->next = NULL;
        return;
    }

    for(node *it = deq.p; it != NULL; it = it->next)
        if(it->val == x) {
            if(it->next != NULL)
                (it->next)->prev = it->prev;
            if(it->prev != NULL)
                (it->prev)->next = it->next;
            it->next = NULL;
            it->prev = NULL;
            delete it;
            return;
        }
}

//bool Find(Deque& deq, const int& x)
bool Find(Deque& deq, int& x) {
    node *it = deq.p;

    while(it != NULL) {
        if(it->val == x)
            return 1;
        it = it->next;
    }
    return 0;
}

int main() {
    ifstream f("hashuri.in");
    ofstream g("hashuri.out");
    int op, n, x, i;

    f>>n;
    for(i = 1; i <= n; i++) {
        f>>op>>x;
        if(op == 1) {
            if(Find(H[x % prim], x) == 0)
                Insert(H[x % prim], x);
        } else
            if(op == 2) {
                Delete(H[x % prim], x);

            } else
                g<<Find(H[x % prim], x)<<'\n';

    }

    return 0;
}