| 比赛 |
2026.8.26 |
评测结果 |
AAAAAAAAAAAAAWWWWWWW |
| 题目名称 |
interval |
最终得分 |
65 |
| 用户昵称 |
默 |
运行时间 |
3.508 s |
| 代码语言 |
C++ |
内存使用 |
63.16 MiB |
| 提交时间 |
2026-08-26 12:45:13 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=250010;
int n,q;
int a[N],b[N];
inline int read(){
int t=0,f=1;
register char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?(-1):(f),c=getchar();
while(c>='0'&&c<='9') t=(t<<3)+(t<<1)+(c^48),c=getchar();
return t*f;
}
struct Subtask1{
int len;
int li[N];
void Solve(int l,int r){
len=0;
for(int i=l;i<=r;i++) li[++len]=b[i];
sort(li+1,li+1+len);len=unique(li+1,li+1+len)-(li+1);
bool flag=false;
for(int i=l;i<=r;i++){
int x=lower_bound(li+1,li+1+len,b[i])-li;
if(x>(b[i]-a[i])&&li[x-(b[i]-a[i])]==a[i]);
else{flag=true;break;}
}
cout<<(!flag)<<" ";
}
void solve(){
while(q--){
int l=read()+1,r=read()+1;
Solve(l,r);
}
}
}Sub1;
struct Subtask2{
struct Tree1{
int tr[N];
int lowbit(int x){return x&-x;}
void update(int x,int y){
while(x) tr[x]=max(tr[x],y),x-=lowbit(x);
}
int query(int x){
int res=0;
while(x<=n) res=max(res,tr[x]),x+=lowbit(x);
return res;
}
}Tr1;
struct Tree2{
int tr[N];
int lowbit(int x){return x&-x;}
void update(int x){
x++;
while(x<=n) tr[x]++,x+=lowbit(x);
}
int query(int x){
int res=0;
while(x) res+=tr[x],x-=lowbit(x);
return res;
}
}Tr2;
int p[N],las[N];
void init(){
for(int i=1;i<=n;i++)
if(b[i]<=n) las[i]=p[b[i]],p[b[i]]=i;
}
int L[N],R[N],ans[N],sum[N];
vector<int> g[N];
void solve(){
init();
for(int i=1;i<=q;i++){
L[i]=read()+1,R[i]=read()+1;
g[R[i]].push_back(i),g[L[i]-1].push_back(-i);
}
for(int i=1;i<=n;i++){
Tr1.update(i,b[i]),Tr2.update(las[i]);
//无垠中 谁来拯救
//漂泊的体征 只剩这躯壳
for(int j:g[i]){
if(j<0){sum[-j]-=Tr2.query(L[-j]);continue;}
int max1=Tr1.query(L[j]);sum[j]+=Tr2.query(L[j]);
// cout<<"Max1:"<<max1<<" Max2:"<<sum[j]<<"\n";
if(max1==sum[j]) ans[j]=1;
}
}
for(int i=1;i<=q;i++) cout<<ans[i]<<" ";cout<<"\n";
}
}Sub2;
struct Subtask3{
int sum[N][102],sumq[N][102];
int L[N],R[N],ans[N];
vector<int> g[N];
void solve(){
for(int i=1;i<=q;i++){
L[i]=read()+1,R[i]=read()+1;
g[R[i]].push_back(i);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=100;j++) sum[i][j]=sum[i-1][j],sumq[i][j]=sumq[i-1][j];
sum[i][b[i]]++;
for(int j=a[i];j<=b[i];j++) sumq[i][j]++;
for(int j:g[i]){
for(int k=1;k<=100;k++){
if((sumq[R[j]][k]-sumq[L[j]-1][k])&&!(sum[R[j]][k]-sum[L[j]-1][k])){
ans[j]=1;break;
}
}
}
}
for(int i=1;i<=q;i++) cout<<!ans[i]<<" ";cout<<"\n";
}
}Sub3;
signed main(){
freopen("intervallavretni.in","r",stdin);
freopen("intervallavretni.out","w",stdout);
n=read(),q=read();
for(int i=1;i<=n;i++) a[i]=read(),b[i]=read();
bool flag=false,flag1=false;
for(int i=1;i<=n;i++) if(a[i]!=1) flag=true;
for(int i=1;i<=n;i++) if(b[i]>100) flag1=true;
if(n<=2000&&q<=2000) Sub1.solve();
else if(!flag1) Sub3.solve();
else Sub2.solve();
// Sub3.solve();
return 0;
}