| 比赛 |
2026.8.26 |
评测结果 |
AAAAAAAAWWWAAWWWWWWW |
| 题目名称 |
interval |
最终得分 |
50 |
| 用户昵称 |
123 |
运行时间 |
5.279 s |
| 代码语言 |
C++ |
内存使用 |
28.13 MiB |
| 提交时间 |
2026-08-26 12:50:16 |
显示代码纯文本
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=1e6+10,inf=1e9,K=22;
int n,q,a[N],b[N],c[N],tot=0,s[N][K],lg[N],ans[N],root;
vector<int> v;
unordered_map<int,int> mp;
struct node {
int l,r,num;
} e[N];
struct tree {
int ls,rs,mx;
} tr[N*8];
void solve1(int l,int r)
{
v.clear(),mp.clear();
for (int i=l;i<=r;i++)
{
if (!mp[b[i]]) v.pb(b[i]),mp[b[i]]=1;
}
sort(v.begin(),v.end());
for (int i=l;i<=r;i++)
{
if (a[i]==b[i]) continue;
int x=a[i],y=b[i]-1;
int cnt1=lower_bound(v.begin(),v.end(),x)-v.begin(),cnt2=lower_bound(v.begin(),v.end(),y)-v.begin();
if (v[cnt1]!=x || v[cnt2]!=y || cnt2-cnt1+1!=y-x+1)
{
cout<<"0 ";
return ;
}
}
cout<<"1 ";
}
int query(int p,int l,int r,int x)
{
if (l==r) return l;
int mid=l+r>>1;
// cout<<l<<" "<<r<<endl;
if (tr[tr[p].ls].mx<x) return query(tr[p].ls,l,mid,x);
else return query(tr[p].rs,mid+1,r,x);
}
int find(int x,int y)
{
int z=lg[y-x+1];
return max(s[x][z],s[y-(1<<z)+1][z]);
}
int solve3(int l,int r)
{
int mx=find(l,r);
// cout<<l<<" "<<r<<" "<<query(1,1,inf,l)<<endl;
return query(1,1,inf,l)>=mx;
}
void update(int &p,int l,int r,int x,int y)
{
// cout<<l<<" "<<r<<" "<<x<<endl;
if (!p) p=++tot;
if (l==r)
{
tr[p].mx=y;
return ;
}
int mid=l+r>>1;
if (x<=mid) update(tr[p].ls,l,mid,x,y);
if (mid<x) update(tr[p].rs,mid+1,r,x,y);
tr[p].mx=min(tr[tr[p].ls].mx,tr[tr[p].rs].mx);
}
void init2()
{
s[1][0]=b[1]-1;
for (int i=2;i<=n;i++) lg[i]=lg[i>>1]+1,s[i][0]=b[i]-1;
for (int j=1;j<=20;j++)
{
for (int i=1;i+(1<<j)-1<=n;i++) s[i][j]=max(s[i][j-1],s[i+(1<<(j-1))][j-1]);
}
}
int cmp(node x,node y)
{
return x.r<y.r;
}
void solve() {
cin>>n>>q;
for (int i=1;i<=n;i++) cin>>a[i]>>b[i];
for (int i=1;i<=q;i++)
{
int l,r;
cin>>l>>r;l++,r++;
if (n<=2000) solve1(l,r);
e[i]={l,r,i};
}
if (n<=2000) return ;
init2();
sort(e+1,e+q+1,cmp);
int now=1;
for (int i=1;i<=q;i++)
{
while (now<=e[i].r) update(root,1,inf,b[now],now),now++;
ans[e[i].num]=solve3(e[i].l,e[i].r);
}
for (int i=1;i<=q;i++) cout<<ans[i]<<" ";
}
int main() {
freopen("intervallavretni.in","r",stdin);
freopen("intervallavretni.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
solve();
return 0;
}