用两个数组,分别记录车所占的行和列的前缀和,每次查询可直接计算。
多亏这道题二维数组开不下,否则还真有可能想不到这种方法。
/*
Title :Conturbatio
Status:AC
By wf,2015 09 26
*/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#define FOR(i,s,t) for(int i = (s) ; i <= (t) ; ++i )
typedef long long ll;
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e5+5;
//std::vector<int> a[maxn];
int h[maxn],l[maxn];
int n,m,k,q,x,y,xx,yy;
int n1,n2;
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&n,&m,&k,&q);
memset(h,0,sizeof h);
memset(l,0,sizeof l);
while(k--){
scanf("%d%d",&x,&y);
if(h[x]==0){
h[x]=1;
}
if(l[y]==0){
l[y]=1;
}
}
for(int i=1;i<=n;++i){
h[i]=h[i-1]+h[i];
}
for(int j=1;j<=m;++j){
l[j]=l[j-1]+l[j];
}
while(q--){
scanf("%d%d%d%d",&x,&y,&xx,&yy);
n1=h[xx]-h[x-1];
n2=l[yy]-l[y-1];
int tmp=n1*(yy-y+1)+n2*(xx-x+1)-n1*n2;
int all=(xx-x+1)*(yy-y+1);
if(tmp==all)
printf("Yes\n" );
else
printf("No\n");
}
}
return 0;
}