RT,交了好几发都只有#4过了,原本想着打主席树的,但是感觉太麻烦了,后来想了想这种只求个数不求k大的直接把询问离线然后用普通数据结构就能搞,然后WA了
把增加树还有询问分配到离散化之后的x上,然后树状数组维护的是在当前这个坐标,所有x坐标小于等于当前的树在y上的分布情况,不知道为啥错了
#include<bits/stdc++.h>
using namespace std;
int n,m,t1,t2,x[500005],y[500005],tx[500005],ty[500005];
int ans[500005][2],c[500005];
vector<int>h[500005];
struct node{
int tar,val,pos;
};
vector<node>q[500005];
void add(int x,int v){
while(x<=t2){
c[x]+=v;
x+=x&-x;
}
}
int sum(int x){
int res=0;
while(x){
res+=c[x];
x-=x&-x;
}
return res;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
tx[i]=x[i];
ty[i]=y[i];
}
sort(tx+1,tx+n+1);
sort(ty+1,ty+n+1);
t1=unique(tx+1,tx+n+1)-tx;
t2=unique(ty+1,ty+n+1)-ty;
// cout<<t1<<" "<<t2<<" "<<mp1[0]<<endl;
for(int i=1;i<=n;i++){
x[i]=lower_bound(tx+1,tx+t1+1,x[i])-tx;
y[i]=lower_bound(ty+1,ty+t2+1,y[i])-ty;
h[x[i]].push_back(y[i]);
}
for(int i=1;i<=m;i++){
int a,b,c,d;
cin>>a>>b>>c>>d;
a=lower_bound(tx+1,tx+t1+1,a)-tx;
b=lower_bound(ty+1,ty+t2+1,b)-ty;
c=upper_bound(tx+1,tx+t1+1,c)-tx-1;
d=upper_bound(ty+1,ty+t2+1,d)-ty-1;
q[a-1].push_back((node){i,b-1,0});
q[c].push_back((node){i,d,1});
}
for(int i=0;i<=t1;i++){
for(int j=0;j<h[i].size();j++)
add(h[i][j],1);
for(int j=0;j<q[i].size();j++)
ans[q[i][j].tar][q[i][j].pos]=sum(q[i][j].val);
}
// cout<<sum()<<endl;
for(int i=1;i<=m;i++)
cout<<ans[i][1]-ans[i][0]<<'\n';
}