#include<bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
#define int long long
using namespace std;
int n,m,a[(1<<21)|1],b[(1<<21)|1];
struct aa
{
int l,r,max,maxsum=1;
}t[(1<<23)|1];
inline int read()
{
register int x=0;register bool f=1;
register char c=getchar();
for(;c<'0'||c>'9';c=getchar())if(c=='-')f=0;
for(;'0'<=c&&c<='9';c=getchar())x=(x<<1)+(x<<3)+(c^48);
return f?x:~x+1;
}
void write(int x)
{
if(x<0)putchar('-'),x=~x+1;
if(x>9)write(x/10);
putchar((x%10)+'0');
}
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline void swap(int &x,int &y){int tmp=x;x=y;y=tmp;}
/*inline void push_up(int p){t[p].sum=t[ls].sum+t[rs].sum;}
inline void push_down(int p)
{
if(t[p].add)
{
t[ls].add+=t[p].add;t[rs].add+=t[p].add;
t[ls].sum+=t[p].add*(t[ls].r-t[ls].l+1);
t[rs].sum+=t[p].add*(t[rs].r-t[rs].l+1);
t[p].add=0;
}
}*/
void push_up(int p)
{
if(t[p].max==t[ls].max&&t[ls].max==t[rs].max)t[p].maxsum+=t[ls].maxsum+t[rs].maxsum;
else if(t[p].max==t[ls].max&&t[ls].max>t[rs].max)t[p].maxsum+=t[ls].maxsum;
else if(t[p].max==t[rs].max&&t[ls].max<t[rs].max)t[p].maxsum+=t[rs].maxsum;
else if(t[ls].max>t[rs].max)t[p].max=t[ls].max,t[p].maxsum=t[ls].maxsum;
else if(t[ls].max==t[rs].max)t[p].max=t[ls].max,t[p].maxsum=t[ls].maxsum+t[rs].maxsum;
else if(t[ls].max<t[rs].max)t[p].max=t[rs].max,t[p].maxsum=t[rs].maxsum;
}
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r)
{
t[p].max=b[l];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
push_up(p);
}
/*void update(int ql,int qr,int p,int k)
{
if(ql<=t[p].l&&t[p].r<=qr)
{
t[p].sum+=k*(t[p].r-t[p].l+1);
t[p].add+=k;return;
}
push_down(p);
int mid=(t[p].l+t[p].r)>>1;
if(ql<=mid)update(ql,qr,ls,k);
if(qr>mid)update(ql,qr,rs,k);
push_up(p);
}*/
aa query(int ql,int qr,int p)
{
aa res=0;
if(qr<t[p].l||t[p].r<ql)return res;
if(ql<=t[p].l&&t[p].r<=qr)return t[p];
int mid=t[p].l+t[p].r>>1;
if(ql<=mid&&mid<qr)
{
if(res.query(ql,qr,ls)>res)
//res=max(res,query(ql,qr,ls));
}
if(qr>mid)res=max(res,query(ql,qr,rs));
return res;
}
signed main(void)
{
int i,b,c,d,ans;
n=read();m=read();
if(!n||!m)return 0;
for(i=1;i<=n;++i)a[i]=read(),b[i]=read();
build(1,1,n);
for(;m;--m)
{
c=read(),d=read();
int nc=upper_bound(a+1,a+1+n,c)-a;
int nd=find(a+1,a+1+n,d)-a;
if(nc!=n+1&&nd!=n+1)
{
ans=query(nc,nd,1);
if(ans==b[nd]&&a[nd]-a[nc-1]==nd-nc+1)
{
}
}
}
return 0;
}
临时文件
发布时间 2023-11-07 21:16:10作者: minecraft114514