小滕有一大片土地用来种植农作物,土地可以看成一个 n×m 的长方形。 但是最近小腾发现自己的农作物经常被一群人偷走,于是他决定安装一些监控器,把所有的人都找出来,然后和他们谈判。 可是小腾买的监控器不好,每个监控器只能监控一个长方形内的农作物。小腾安装的监控器有 p 个,每个监控器监控的长方形是已知的。 小腾猜测小偷也会偷 q 次的农作物,他也猜到了他们要偷的范围,也是一个长方形。小腾想知道他的监控器是否能同时看到所有的小偷。

Input

有多个测试案例。

每个案例的开头一行包含两个整数 n,m(1≤n,1≤m,n×m≤10^7),代表土地的面积,第二行包含一个整数 p(1≤p≤10^6),代表小腾安装的显示器数量。

而第二行包含一个整数 p(1≤p≤10^6),代表小腾安装的显示器的数量。之后是 p 行,每行描述一个矩形。每一行都包含四个整数 x1,y1,x2,y2(1≤x1≤x2≤n,1≤y1≤y2≤m),表示矩形的左下角和右上角。

下一行包含一个整数 q(1≤q≤10^6),代表小偷偷窃农作物的次数,接下来是 q 行,每行描述一个矩形。每一行都包含四个整数 x1,y1,x2y2(1≤x1≤x2≤n,1≤y1≤y2≤m),表示矩形的左下角和右上角。

AC代码:

#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>
//#define int long long
using namespace std;
const int N=1e6+5,M=1005;
typedef pair<int,int> PII;
vector<vector<int> > a,sum;
int n,m;
int main(){
while(~scanf("%d%d",&n,&m)){
a.resize(n+10);
for(int i=0;i<=n+5;i++)a[i].resize(m+10);
for(int i=0;i<=n+1;i++)
for(int j=0;j<=m+1;j++)
a[i][j]=0;

int p;
scanf("%d",&p);
while(p--){
int x1,y1,x2,y2;
//cin>>x1>>y1>>x2>>y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
a[x1][y1]+=1;
a[x2+1][y1]-=1;
a[x1][y2+1]-=1;
a[x2+1][y2+1]+=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];

for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=min(1,a[i][j]);

for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];

int q;
scanf("%d",&q);
while(q--){
int x1,y1,x2,y2;
//cin>>x1>>y1>>x2>>y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int s=a[x2][y2]-a[x1-1][y2]-a[x2][y1-1]+a[x1-1][y1-1];
if(s==(x2-x1+1)*(y2-y1+1))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
}