WA两个点,很奇怪,拍不出来。
https://www.luogu.com.cn/record/81851413
//g++ c2.cpp -g -o c2 -std=c++14 -O0 -Wall
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=3e5+10,maxh=2e6+10,_maxh=1e6+5;
int N,M,f[maxh],ans[maxn<<1];
struct node{int x,y,v,id;}a[maxn<<1],_a[maxn<<1],a0[maxn<<1];
int qd(){
int rt=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while('0'<=c&&c<='9') rt=(rt<<3)+(rt<<1)+c-48,c=getchar();
return rt;
}
bool cmpx(const node &x,const node &y){return x.x<y.x;}
bool cmpi(const node &x,const node &y){return x.id<y.id;}
#define lowbit(t) ((t)&-(t))
void change(int t,int v){for(;t<maxh;t+=lowbit(t)) f[t]=max(f[t],v);}
void rchange(int t){for(;t<maxh&&f[t];t+=lowbit(t)) f[t]=0;}
int ask(int t){int rt=0;for(;t;t-=lowbit(t)) rt=max(rt,f[t]);return rt;}
void cdq(int l,int r){
// printf("%d,%d\n",l,r);
if(l>=r) return;
int m=(l+r)>>1;
cdq(l,m),cdq(m+1,r);
// sort(a+l,a+m+1,cmpx),sort(a+m+1,a+r+1,cmpx);
for(int t1=l,t2=m+1;t2<=r;t2++){
for(;a[t1].x<=a[t2].x&&t1<=m;t1++) if(a[t1].v==-1) change(a[t1].y,a[t1].x+a[t1].y);
if(a[t2].v!=-1) a[t2].v=min(a[t2].v,a[t2].x+a[t2].y-ask(a[t2].y));
}
for(int i=l;i<=m;i++) if(a[i].v==-1) rchange(a[i].y);
// printf("end %d,%d:\n",l,r);
// for(int i=1;i<=N+M;i++) printf("%d:%d %d,%d %d\n",i,a[i].id,a[i].x,a[i].y,a[i].v);
// putchar('\n');
for(int t1=l,t2=m+1,t0=l;t0<=r;t0++){
if(t1>m) _a[t0]=a[t2++];
else if(t2>r) _a[t0]=a[t1++];
else if(cmpx(a[t1],a[t2])) _a[t0]=a[t1++];
else _a[t0]=a[t2++];
}
for(int i=l;i<=r;i++) a[i]=_a[i];
}
#define ad a[i].id
int main(){
freopen("in.txt","r",stdin);
N=qd(),M=qd();
for(int i=1;i<=N;i++) a0[i].x=qd()+1,a0[i].y=qd()+1,a0[i].v=-1,a0[i].id=0;
for(int i=1;i<=M;i++) ans[i]=a0[N+i].v=(qd()==1?-1:maxh),a0[N+i].x=qd()+1,a0[N+i].y=qd()+1,a0[N+i].id=i;
for(int i=1;i<=N+M;i++) a[i]=a0[i];
cdq(1,N+M);
for(int i=1;i<=N+M;i++) ans[ad]=min(ans[ad],a[i].v);
for(int i=1;i<=N+M;i++) a[i]=a0[i],a[i].x=_maxh-a[i].x;
cdq(1,N+M);
for(int i=1;i<=N+M;i++) ans[ad]=min(ans[ad],a[i].v);
for(int i=1;i<=N+M;i++) a[i]=a0[i],a[i].y=_maxh-a[i].y;
cdq(1,N+M);
for(int i=1;i<=N+M;i++) ans[ad]=min(ans[ad],a[i].v);
for(int i=1;i<=N+M;i++) a[i]=a0[i],a[i].x=_maxh-a[i].x,a[i].y=_maxh-a[i].y;
cdq(1,N+M);
for(int i=1;i<=N+M;i++) ans[ad]=min(ans[ad],a[i].v);
for(int i=1;i<=M;i++) if(ans[i]!=-1) printf("%d\n",ans[i]);
return 0;
}