理论:
https://blog.csdn.net/k_r_forever/article/details/81775899

题目:
https://blog.csdn.net/LSD20164388/article/details/89412548

Monitor
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 163840/163840 K (Java/Others)
Total Submission(s): 872 Accepted Submission(s): 145

Problem Description
Xiaoteng has a large area of land for growing crops, and the land can be seen as a rectangle of n×m.

But recently Xiaoteng found that his crops were often stolen by a group of people, so he decided to install some monitors to find all the people and then negotiate with them.

However, Xiao Teng bought bad monitors, each monitor can only monitor the crops inside a rectangle. There are p monitors installed by Xiaoteng, and the rectangle monitored by each monitor is known.

Xiao Teng guess that the thieves would also steal q times of crops. he also guessed the range they were going to steal, which was also a rectangle. Xiao Teng wants to know if his monitors can see all the thieves at a time.

Input
There are mutiple test cases.

Each case starts with a line containing two integers n,m(1≤n,1≤m,n×m≤107) which represent the area of the land.

And the secend line contain a integer p(1≤p≤106) which represent the number of the monitor Xiaoteng has installed. This is followed by p lines each describing a rectangle. Each of these lines contains four intergers x1,y1,x2 and y2(1≤x1≤x2≤n,1≤y1≤y2≤m) ,meaning the lower left corner and upper right corner of the rectangle.

Next line contain a integer q(1≤q≤106) which represent the number of times that thieves will steal the crops.This is followed by q lines each describing a rectangle. Each of these lines contains four intergers x1,y1,x2 and y2(1≤x1≤x2≤n,1≤y1≤y2≤m),meaning the lower left corner and upper right corner of the rectangle.

Output
For each case you should print q lines.

Each line containing YES or NO mean the all thieves whether can be seen.

Sample Input
6 6
3
2 2 4 4
3 3 5 6
5 1 6 2
2
3 2 5 4
1 5 6 5

Sample Output
YES
NO

Hint
In the picture,the red solid rectangles mean the monitor Xiaoteng installed, and the blue dotted rectangles mean the area will be stolen.

感谢:LSD20164388,Zookkk
https://blog.csdn.net/LSD20164388/article/details/89412548

下面这份是我打了注释的:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
using namespace std;
const int maxn=10000010;
int n,m,k,p,q;
int a[maxn];

//哈希函数 
int getid(int i,int j)
{
    if(i==0||j==0||i>n||j>m) return 0;
    return (i-1)*m+j;
}

//添加监视器 
void add(int i,int j,int v)
{
    if(getid(i,j)==0) return;
    a[getid(i,j)]+=v;
}

//查询 
int query(int i,int j)
{
    return a[getid(i,j)];
}


int main()
{
    int T,cas=1;
    while(scanf("%d%d",&n,&m)!=EOF)
	{
		//初始化所有前缀和 为 0 
        rep(i,1,n)
        rep(j,1,m) a[getid(i,j)]=0;
        
        //输入p个监视器 
        scanf("%d",&p);
        while(p--)
        {
        	//输入监视器的监视范围 
            int x,y,xx,yy;
            scanf("%d%d%d%d",&x,&y,&xx,&yy);
            //加一个范围 
            add(x,y,1);
            add(xx+1,yy+1,1);
            add(xx+1,y,-1);
            add(x,yy+1,-1);
        }
        
        //加过监视器后,我们初始化监视器的监视范围 
        rep(i,1,n)
        rep(j,1,m)
        {
            a[getid(i,j)]+=query(i-1,j)+query(i,j-1)-query(i-1,j-1);
            //cout<<a[getid(i,j)]<<" ";
            //if(j==m) cout<<endl;
        }
        //把所有没有被监视的区域都映射到a[0] 
        rep(i,1,n)
        rep(j,1,m)
        a[getid(i,j)]=(a[getid(i,j)]>0);
        //计算出来a[i,j]的前缀和 
        rep(i,1,n)
        rep(j,1,m)
        a[getid(i,j)]+=query(i-1,j)+query(i,j-1)-query(i-1,j-1);
        //输入q个问题 
        scanf("%d",&q);
        while(q--)
        {
        	//输入小偷的范围 
            int x,y,xx,yy;
            scanf("%d%d%d%d",&x,&y,&xx,&yy);
            //查询这个范围内已经覆盖了的面积 
            int ans=query(xx,yy)+query(x-1,y-1)-query(x-1,yy)-query(xx,y-1);
            //cout<<ans<<" "<<(xx-x+1)*(yy-y+1)<<endl;
            //如果已经覆盖的面积等于总面积,那么输出YES 
            if(ans==(xx-x+1)*(yy-y+1)) puts("YES");
            else puts("NO");
        }
        //printf("%d\n",ans);
    }
    return 0;
}