比赛 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;
 }