rt 教练的 OJ 不能吸氧 这份程序跑了 8s 怎么卡
#include<bits/stdc++.h>
#define reg register
#define N 300005
#define M 1000005
using namespace std;
int n,m,ans[N*2],maxy;
struct oper{
int opr,x,y,id;
}q[N*2],b[N*2];
inline bool cmp(oper a,oper b)
{
return a.x<b.x;
}
struct BIT{
int tr[M];
inline void add(int x,int v)
{
while(x<=maxy)
{
tr[x]=max(tr[x],v);
x+=x&-x;
}
return;
}
inline int ask(int x)
{
int maxx=-1e9;
while(x)
{
maxx=max(maxx,tr[x]);
x-=x&-x;
}
return maxx;
}
inline void clear(int x)
{
while(x<=maxy)
{
tr[x]=-1e9;
x+=x&-x;
}
}
}tr;
int stk[4*N],top;
inline void solve(int l,int r)
{
if(l==r) return;
int mid=(l+r)/2;
solve(l,mid);
solve(mid+1,r);
for(reg int i=l;i<=r;i++) b[i]=q[i];
sort(q+l,q+1+mid,cmp);
sort(q+mid+1,q+1+r,cmp);
int i=l,j=mid+1;
for(j=mid+1;j<=r;j++)
{
while(i<=mid&&q[i].x<=q[j].x)
{
if(q[i].opr==2)
{
++i;
continue;
}
tr.add(q[i].y,q[i].x+q[i].y);
stk[++top]=q[i].y;
++i;
}
if(q[j].opr==2)
ans[q[j].id]=min(ans[q[j].id],q[j].x+q[j].y-tr.ask(q[j].y));
}
while(top) tr.clear(stk[top--]);
for(reg int i=l;i<=r;i++) q[i]=b[i];
}
int main()
{
scanf("%d%d",&n,&m);
for(reg int i=1;i<=n;i++)
{
q[i].id=i;
q[i].opr=1;
scanf("%d%d",&q[i].x,&q[i].y);
q[i].x++,q[i].y++;
maxy=max(maxy,q[i].y);
}
for(reg int i=n+1;i<=n+m;i++)
scanf("%d%d%d",&q[i].opr,&q[i].x,&q[i].y),q[i].id=i,ans[i]=2e9,q[i].x++,q[i].y++,maxy=max(maxy,q[i].y);
maxy++;
fill(tr.tr,tr.tr+1+M-3,-1e9);
solve(1,n+m);
for(reg int i=1;i<=n+m;i++)
q[i].x=M-q[i].x;
solve(1,n+m);
for(reg int i=1;i<=n+m;i++)
q[i].y=maxy-q[i].y;
solve(1,n+m);
for(reg int i=1;i<=n+m;i++)
q[i].x=M-q[i].x;
solve(1,n+m);
for(reg int i=n+1;i<=m+n;i++)
if(q[i].opr==2) printf("%d\n",ans[i]);
return 0;
}