比赛 |
EYOI与SBOI开学欢乐赛10th |
评测结果 |
AAAAAAAAAA |
题目名称 |
耍猴游戏 |
最终得分 |
100 |
用户昵称 |
ZRQ |
运行时间 |
2.193 s |
代码语言 |
C++ |
内存使用 |
10.69 MiB |
提交时间 |
2022-10-10 21:57:13 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005,X=200010;
struct node
{
int id,op,x,y,k;
}q[N],p[N];
int n,m,mx,tot,ans[N];
char ch;
int t[X];
inline void read(int &x){x=0;ch=getchar();while(ch<48||ch>57)ch=getchar();while(ch>47&&ch<58)x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return ;}
bool cmp1(node a,node b)
{
return a.x<b.x;
}
void add(int i,int k)
{
while(i<=mx) t[i]=max(t[i],k),i+=(i&-i);
return;
}
int query(int i)
{
int res=0;
while(i) res=max(res,t[i]),i-=(i&-i);
return res;
}
void del(int i)
{
while(i<=mx) t[i]=0,i+=(i&-i);
return ;
}
void CDQ(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>1;
int i,j,s=l,t=mid+1;
for(int i=l;i<=r;++i)
if(q[i].id<=mid) p[s++]=q[i];
else p[t++]=q[i];
for(int i=l;i<=r;++i) q[i]=p[i];
i=l;
for(j=mid+1;j<=r;++j)
{
if(q[j].op!=2) continue;
for(i;i<=mid&&q[i].x<=q[j].x;++i)
if(q[i].op==1)
add(q[i].y,q[i].x+q[i].y);
int cur=query(q[j].y);
if(cur) ans[q[j].k]=min(ans[q[j].k],q[j].x+q[j].y-cur);
}
for(j=l;j<i;++j)
if(q[j].op==1)
del(q[j].y);
CDQ(l,mid);
CDQ(mid+1,r);
return;
}
int main()
{
freopen("monkeygame.in","r",stdin);
freopen("monkeygame.out","w",stdout);
memset(ans,0x3f,sizeof(ans));
int t,x,y;
read(n),read(m);
for(int i=1;i<=n;++i) read(x),read(y),++x,++y,q[i]=(node){i,1,x,y,0},mx=max(mx,max(x,y));
for(int i=1;i<=m;++i)
{
read(t),read(x),read(y);
++x,++y;
mx=max(mx,max(x,y));
if(t==1) q[n+i]=(node){n+i,1,x,y,0};
else q[n+i]=(node){n+i,2,x,y,++tot};
}
++mx;
sort(q+1,q+1+n+m,cmp1);
CDQ(1,n+m);
for(int i=1;i<=n+m;++i) q[i].x=-q[i].x+mx;
sort(q+1,q+1+n+m,cmp1);
CDQ(1,n+m);
for(int i=1;i<=n+m;++i) q[i].y=-q[i].y+mx;
sort(q+1,q+1+n+m,cmp1);
CDQ(1,n+m);
for(int i=1;i<=n+m;++i) q[i].x=-q[i].x+mx;
sort(q+1,q+1+n+m,cmp1);
CDQ(1,n+m);
for(int i=1;i<=tot;++i) printf("%d\n",ans[i]);
return 0;
}