Cod sursa(job #1525211)

Utilizator Athena99Anghel Anca Athena99 Data 14 noiembrie 2015 20:52:09
Problema Ograzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <string>
#include <vector>

using namespace std;

ifstream fin("ograzi.in");
ofstream fout("ograzi.out");

const int mod= 666013;

int n, m, w, h;
string buffer;
string::iterator buffer_it;

void read_int_nn( int &x ) {
    for ( ; *buffer_it>'9' || *buffer_it<'0'; ++buffer_it ) ;
    for ( x= 0; *buffer_it>='0' && *buffer_it<='9'; ++buffer_it ) {
        x= x*10+*buffer_it-'0';
    }
}

struct str {
    int x, y;
};

vector <str> v[mod];

inline str mp( int x, int y ) {
    str sol;
    sol.x= x, sol.y= y;
    return sol;
}

inline bool check( int k, int x, int y ) {
    if ( k>=0 ) {
        for ( vector <str>::iterator it= v[k].begin(); it!=v[k].end(); ++it ) {
            if ( (*it).x<=x && (*it).x+w>=x && (*it).y<=y && (*it).y+h>=y ) {
                return 1;
            }
        }
    }
    return 0;
}

int main(  ) {
    getline( fin, buffer, (char)0 );
    buffer_it= buffer.begin();

    read_int_nn(n), read_int_nn(m);
    read_int_nn(w), read_int_nn(h);
    for ( int i= 1, x, y; i<=n; ++i ) {
        read_int_nn(x), read_int_nn(y);
        v[((x/w)*1001+y/h)%mod].push_back(mp(x, y));
    }

    int sol= 0;
    for ( int i= 1, x, y; i<=m; ++i ) {
        read_int_nn(x), read_int_nn(y);
        int k1= ((x/w-1)*1001+y/h-1)%mod, k2= ((x/w-1)*1001+y/h)%mod, k3= ((x/w)*1001+y/h-1)%mod, k4= ((x/w)*1001+y/h)%mod;

        if ( check(k1, x, y) || check(k2, x, y) || check(k3, x, y) || check(k4, x, y) ) {
            ++sol;
        }
    }

    fout<<sol<<"\n";

    return 0;
}