RT
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <queue>
#include <cstring>
#include <map>
#define N 10000005
#define M 500005
#define ls(x) x<<1
#define rs(x) x<<1|1
#define int long long
using namespace std;
int tree[M<<2];
void ins(int l,int r,int root,int x){
if(l==r){
++tree[root];
return ;
}
int mid=(l+r)>>1;
if(x<=mid)
ins(l,mid,ls(root),x);
else
ins(mid+1,r,rs(root),x);
tree[root]=tree[ls(root)]+tree[rs(root)];
}
int query(int l,int r,int root,int ll,int rr){
if(l>=ll&&r<=rr)
return tree[root];
int mid=(l+r)>>1;
int ans=0;
if(ll<=mid)
ans+=query(l,mid,ls(root),ll,rr);
if(rr>mid)
ans+=query(mid+1,r,rs(root),ll,rr);
return ans;
}
int n,m,ans1[M],ans2[M];
struct qqq{
int x,y;
bool operator <(const qqq &b)const{
return x<b.x;
}
}a[M];
struct node{
int l,r,u,v,id;
}ch[M];
bool cmp1(node a,node b){
return a.l<b.l;
}
bool cmp2(node a,node b){
return a.r<b.r;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+n+1);
for(int i=1;i<=m;++i){
cin>>ch[i].l>>ch[i].u>>ch[i].r>>ch[i].v;
ch[i].id=i;
}
sort(ch+1,ch+m+1,cmp1);
int you=1;
a[n+1].x=1e9;
for(int i=1;i<=m;++i){
for(int j=you;;++j){
if(a[j].x>=ch[i].l){
you=j;
break;
}
ins(0,M,1,a[j].y);
}
ans1[ch[i].id]=query(0,M,1,ch[i].u,ch[i].v);
}
you=1;
memset(tree,0,sizeof(tree));
sort(ch+1,ch+m+1,cmp2);
for(int i=1;i<=m;++i){
for(int j=you;;++j){
if(a[j].x>ch[i].r){
you=j;
break;
}
ins(0,M,1,a[j].y);
}
ans2[ch[i].id]=query(0,M,1,ch[i].u,ch[i].v);
}
for(int i=1;i<=m;++i){
cout<<ans2[i]-ans1[i]<<'\n';
}
return 0;
}
我没有离散化,当把M改成N时全MLE了,于是我想想改成M,可是变成现在这样后却AC了,是数据水还是我的写法问题