Cod sursa(job #1706172)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 21 mai 2016 19:57:39
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <bits/stdc++.h>

using namespace std;

constexpr unsigned MAX_N = 1000000;
constexpr unsigned BUFFSIZE = 258257;
constexpr unsigned MOD = (1U << 16) - 1;

inline char getChar() {
  static char buff[BUFFSIZE];
  static int pos = BUFFSIZE;
  if (pos == BUFFSIZE) {
    fread(buff, 1, BUFFSIZE, stdin);
    pos = 0;
  }
  return buff[pos++];
}

inline unsigned readInt() {
  unsigned q = 0;
  char c;
  do {
    c = getChar();
  } while (!isdigit(c));
  do {
    q = (q << 1) + (q << 3) + (c - '0');
    c = getChar();
  } while (isdigit(c));
  return q;
}

struct List {
  unsigned v;
  unsigned next;
};

List adj[MAX_N + 1];
unsigned head[MOD + 1];
unsigned ptr = 1;

void hashInsert(const unsigned arg) {
  const unsigned headPtr = (arg ^ (arg >> 16)) & MOD;
  adj[ptr].v = arg;
  adj[ptr].next = head[headPtr];
  head[headPtr] = ptr++;
}

void hashErase(const unsigned arg) {
  const unsigned headPtr = (arg ^ (arg >> 16)) & MOD;
  if (adj[head[headPtr]].v == arg)
    head[headPtr] = adj[head[headPtr]].next;
  else {
    unsigned iter = head[headPtr];
    while (adj[iter].next && adj[adj[iter].next].v != arg)
      iter = adj[iter].next;
    if (adj[iter].next)
      adj[iter].next = adj[adj[iter].next].next;
  }
}

bool hashFind(const unsigned arg) {
  const unsigned headPtr = (arg ^ (arg >> 16)) & MOD;
  unsigned iter = head[headPtr];
  while (iter && adj[iter].v != arg)
    iter = adj[iter].next;
  return iter;
}

char out[MAX_N + MAX_N + 1];

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

  unsigned q = readInt();

  unsigned outPtr = 0;

  for (unsigned testPtr = 0; testPtr < q; testPtr += 1) {
    unsigned opType = readInt() - 1, arg = readInt();
    if (!opType) {
      hashInsert(arg);
    } else if (opType == 1) {
      hashErase(arg);
    } else {
      out[outPtr] = '0' + hashFind(arg);
      out[outPtr + 1] = '\n';
      outPtr += 2;
    }
  }
  fclose(stdin);
  fwrite(out, 1, outPtr, stdout);
  fclose(stdout);

  return 0;
}