Cod sursa(job #1951430)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 3 aprilie 2017 16:43:29
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <bits/stdc++.h>
#define MOD (1 << 21)
using namespace std;
vector <int> Hash[MOD];
int n;

class Reader {
  public:
    Reader(FILE *_stream, const int _size = (1 << 16)):
      size(_size),
      pointer(0),
      buffer(new char[_size]),
      stream(_stream) {
        assert(fread(buffer, 1, size, stream) != 0);
    }

    template<class IntType>
    IntType NextInt() {
        IntType value = 0;
        bool negative = false;
        while ((Current() < '0' || Current() > '9') && Current() != '-')
            NextPosition();
        if (Current() == '-') {
            negative = true;
            NextPosition();
        }
        while(Current() >= '0' && Current() <= '9') {
            value = value * 10 + Current() - '0';
            NextPosition();
        }
        if (negative)
            value = -value;
        return value;
    }

    Reader &operator>>(int &value) {
        value = NextInt<int>();
        return *this;
    }

  private:
    int size, pointer;
    char *buffer;
    FILE *stream;

    char Current() const {
        return buffer[pointer];
    }

    void NextPosition() {
        if(++pointer == size) {
            assert(fread(buffer, 1, size, stream) != 0);
            pointer = 0;
        }
    }
};

int query(int x)
{
    auto it=find(Hash[x%MOD].begin(), Hash[x%MOD].end(),x);
    if (it != Hash[x%MOD].end()) return 1;
    return 0;
}

void addNumber(int x)
{
    if(query(x)==0) Hash[x%MOD].push_back(x);
}

void removeNumber(int x)
{
    auto it=find(Hash[x%MOD].begin(), Hash[x%MOD].end(),x);
    if (it != Hash[x%MOD].end()) Hash[x%MOD].erase(it);
}

Reader f("hashuri.in");
ofstream g("hashuri.out");

int main()
{
    f>>n;
    for(int i=1;i<=n;i++)
    {
        int t,x;
        f>>t>>x;
        switch(t)
        {
            case 1:
                addNumber(x);
                break;
            case 2:
                removeNumber(x);
                break;
            case 3:
                g<<query(x)<<'\n';
                break;
        }
    }
}