Cod sursa(job #2336160)

Utilizator patcasrarespatcas rares danut patcasrares Data 4 februarie 2019 20:38:23
Problema Ograzi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include<bits/stdc++.h>
#define x first
#define y second
#define pb push_back
using namespace std;
ofstream fout("ograzi.out");
FILE* fin=fopen("ograzi.in","r");
const unsigned maxb=30192;
char buf[maxb];
unsigned ptr=maxb-1;
inline unsigned getint()
{
    unsigned nr=0;
   // cin>>nr;
   // return nr;
    while(buf[ptr]<'0'||buf[ptr]>'9')
        if(++ptr>=maxb)
            fread(buf,maxb,1,fin),ptr=0;
    while(buf[ptr]>='0'&&buf[ptr]<='9')
    {
        nr=nr*10+buf[ptr]-'0';
        if(++ptr>=maxb)
            fread(buf,maxb,1,fin),ptr=0;
    }
    return nr;
}
const int DN=5e4+5,M=666013;
int n,sol,w,h,m,f,g;
pair<int,int>a[DN];
set<pair<long long,int> >v[M];
void add(int f,int g,int pz)
{
	if(f%w)
		f=1+f/w;
	else
		f=f/w;
	if(g%h)
		g=1+g/h;
	else
		g=g/h;
    long long z;
    z=f;
    z*=1e7;
    z+=g;
	v[z%M].insert({z,pz});
}
int findd(int f,int g)
{
	long long z;
	z=f;
    z*=1e7;
    z+=g;
    if(z<0)
    	return 0;
	auto it=v[z%M].lower_bound({z,-1});
	if(it==v[z%M].end())
		return 0;
	if(it->x!=z)
		return 0;
	return it->y;
}
int vf(int f,int g,int f2,int g2)
{
	int pz;
	pz=findd(f,g);
	if(pz==0)
		return 0;
	//cout<<pz<<' '<<f2<<' '<<g2<<'\n';
	if(f2>=a[pz].x&&f2<=a[pz].x+w)
	if(g2>=a[pz].y&&g2<=a[pz].y+h)
		return 1;
	return 0;
}
int solve(int f,int g,int f2,int g2)
{
	if(f%w)
		f=1+f/w;
	else
		f=f/w;
	if(g%h)
		g=1+g/h;
	else
		g=g/h;
	int cnt=0;
	if(vf(f,g,f2,g2))
		return 1;
	if(vf(f,g+1,f2,g2))
		return 1;
	if(vf(f+1,g,f2,g2))
		return 1;
	if(vf(f+1,g+1,f2,g2))
		return 1;

	if(vf(f,g-1,f2,g2))
		return 1;
	if(vf(f-1,g,f2,g2))
		return 1;
	if(vf(f-1,g-1,f2,g2))
		return 1;
	return 0;
}
int main()
{
	n=getint();
	m=getint();
	w=getint();
	h=getint();
	for(int i=1;i<=n;i++)
	{
		a[i].x=getint();
		a[i].y=getint();
		add(a[i].x,a[i].y,i);
	}
	while(m--)
	{
		f=getint();
		g=getint();
	//	cout<<'z'<<f<<' '<<g<<'\n';
		sol+=solve(f,g,f,g);
	}
	fout<<sol;
}