明明看起来没什么差别。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define R register
//#define int long long
#define ld double
#define debug printf("zjy ")
#define lp (p<<1)
#define rp (p<<1|1)
inline int read(){
int a=0,b=1;char c=getchar();
while(!isdigit(c)){if(c=='-')b=-1;c=getchar();}
while(isdigit(c)){a=a*10+c-'0';c=getchar();}
return a*b;
}
void write(int x){
if(x<0){putchar('-');x=-x;}
if(x<=9){putchar(x+'0');return;}
write(x/10);putchar(x%10+'0');
}
void writesp(int x){
write(x);putchar(' ');
}
void writeln(int x){
write(x);putchar('\n');
}
const int N=1e6+50,inf=2e9;
struct node{
int op,x,y,id;
}t[N],temp[N],b[N];
int n,m,len,tot,ans[N];
namespace bit{
int mx[N];
int lowbit(int x){
return x&-x;
}
void add(int x,int z){
for(;x<=len;x+=lowbit(x))mx[x]=max(mx[x],z);
}
int query(int x){
int val=0;
for(;x;x-=lowbit(x))val=max(val,mx[x]);
return val?val:-inf;
}
void clear(int x){
for(;x<=len;x+=lowbit(x))mx[x]=0;
}
}
void cdq(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cdq(l,mid);cdq(mid+1,r);
int x=l,y=mid+1;tot=0;
while(x<=mid&&y<=r){
if(b[x].x<=b[y].x){
if(b[x].op==1){
bit::add(b[x].y,b[x].x+b[x].y);
}
temp[++tot]=b[x];
x++;
}
else{
if(b[y].op==2){
ans[b[y].id]=min(ans[b[y].id],b[y].x+b[y].y-bit::query(b[y].y));
}
temp[++tot]=b[y];
y++;
}
}
while(y<=r){
if(b[y].op==2){
ans[b[y].id]=min(ans[b[y].id],b[y].x+b[y].y-bit::query(b[y].y));
}
temp[++tot]=b[y];
y++;
}
for(R int i=l;i<x;i++)if(b[i].op==1)bit::clear(b[i].y);
while(x<=mid){
temp[++tot]=b[x];
x++;
}
for(R int i=r;i>=l;i--)b[i]=temp[tot--];
}
void solve(bool rx,bool ry){
for(R int i=1;i<=n+m;i++){
b[i]=t[i];
if(rx)b[i].x=len-b[i].x;
if(ry)b[i].y=len-b[i].y;
}
cdq(1,n+m);
}
signed main(){
n=read();m=read();
for(R int i=1;i<=n;i++){
t[i].op=1;
t[i].x=read()+1;t[i].y=read()+1;
len=max(len,max(t[i].x,t[i].y));
}
for(R int i=n+1;i<=n+m;i++){
t[i].op=read();
t[i].x=read()+1;t[i].y=read()+1;
t[i].id=i;
ans[i]=inf;
len=max(len,max(t[i].x,t[i].y));
}
len++;
solve(0,0);solve(0,1);solve(1,0);solve(1,1);
for(R int i=n+1;i<=n+m;i++)if(t[i].op==2)writeln(ans[i]);
return 0;
}