基本上是扫描线2的简化版
其一:不用离散化
其二:要记入边框上的
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <queue>
#include <deque>
#include <algorithm>
#include <cmath>
#include <vector>
#include <stack>
#include <bitset>
#include <set>
#include <map>
#define inf 0x7fffffff
//#define ll long long
//#define int long long
//#define double long double
#define re register int
#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
using namespace std;
//const int mod=1e9+7;
const int M=5e6;
const int N=1e6+5;//?????????? 4e8
struct node
{
int l,r,val,add;
}e[N*4];
int n,h,w;
int tot;
struct lll
{
int x,y,state;
}line[N*4];
void bulid(int p,int l,int r)
{
e[p].l=l;e[p].r=r;
if(l==r)
{
e[p].add=e[p].val=0;
return;
}
int mid=(l+r)>>1;
bulid(ls(p),l,mid);
bulid(rs(p),mid+1,r);
// e[p].val=max(e[ls(p)].val,e[rs(p)].val);
e[p].add=e[p].val=0;
}
void spread(int p)
{
if(e[p].add)
{
e[ls(p)].val+=e[p].add;
e[rs(p)].val+=e[p].add;
e[ls(p)].add+=e[p].add;
e[rs(p)].add+=e[p].add;
e[p].add=0;
}
}
void change(int p,int l,int r,int v)
{
if(l<=e[p].l&&e[p].r<=r)
{
e[p].add+=v;
e[p].val+=v;
return;
}
spread(p);
int mid=(e[p].l+e[p].r)>>1;
if(l<=mid) change(ls(p),l,r,v);
if(mid<r) change(rs(p),l,r,v);
e[p].val=max(e[ls(p)].val,e[rs(p)].val);
}
int ask(int p,int l,int r)
{
if(l<=e[p].l&&e[p].r<=r) return e[p].val;
spread(p);
int ans=0;
int mid=(e[p].l+e[p].r)>>1;
if(l<=mid) ans=max(ans,ask(ls(p),l,r));
if(mid<r) ans=max(ans,ask(rs(p),l,r));
return ans;
}
void init()
{
// memset(line,0,sizeof(line));
// memset(e,0,sizeof(e));
tot=0;
}
bool cmp(lll i,lll j)
{
if(i.x!=j.x) return i.x<j.x;
return i.state>j.state;
}
void solve()
{
while(cin>>n&&n!=-1)
{
int ans=0;
cin>>w>>h;
init();
for(re i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x+=20001,y+=20001;
line[++tot].x=x,line[tot].y=y,line[tot].state=1;
line[++tot].x=x+w,line[tot].y=y,line[tot].state=-1;
// line[++tot]=(lll){x,y,1};
// line[++tot]=(lll){x+w,y,-1};
}
sort(line+1,line+tot+1,cmp);
bulid(1,1,60001);
for(re i=1;i<=tot;i++)
{
change(1,line[i].y,line[i].y+h,line[i].state);
// ans=max(ans,ask(1,1,60001));
ans=max(ans,e[1].val);
}
cout<<ans<<endl;
}
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}
/*
*/