Cod sursa(job #1463107)

Utilizator theprdvtheprdv theprdv Data 20 iulie 2015 02:49:34
Problema Ograzi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#define MOD 666013
#define f first
#define s second
#define foreach(G) for (decltype((G).begin()) it = (G).begin(); it != (G).end(); ++it)

using namespace std;

const int Z = 1024;
int N, M, W, H, cnt;
vector <pair<int, int>> Hash[MOD];
char b[15];

inline int _hash(int x, int y) { return (x / W) * Z + y / H; }

void add(pair <int, int> p){
	Hash[_hash(p.f, p.s) / MOD].push_back(p);
}

pair <int, int> read(){
	gets(b);
	int i = 0;
	pair <int, int> p;
	while (!(b[i] >= '0' && b[i] <= '9')) ++i;

	for (; b[i] >= '0' && b[i] <= '9'; ++i)
		p.f = p.f * 10 + (b[i] - '0');

	for (++i; b[i] >= '0' && b[i] <= '9'; ++i)
		p.s = p.s * 10 + (b[i] - '0');

	return p;
}

inline bool check(pair <int, int> p){
	for (int i = -1; i < 1; ++i)
		for (int j = -1; j < 1; ++j)
			foreach(Hash[_hash(p.f + i, p.s + j) / MOD]) if (it->f <= p.f && it->f + W >= p.f && it->s <= p.s && it->s + H >= p.s) 
			return 1;
	return 0;
}

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

	scanf("%d %d %d %d\n", &N, &M, &W, &H);

	for (; N; --N) 
		add(read());
	
	for (; M; --M) 
		cnt += check(read());

	printf("%d", cnt);

	return 0;
}