| 比赛 |
2026.8.26 |
评测结果 |
WWATTWAATWWWWWWWWWWW |
| 题目名称 |
interval |
最终得分 |
15 |
| 用户昵称 |
dream |
运行时间 |
8.630 s |
| 代码语言 |
C++ |
内存使用 |
7.37 MiB |
| 提交时间 |
2026-08-26 12:50:49 |
显示代码纯文本
#include<bits/stdc++.h>
#define ls p*2
#define rs p*2+1
using namespace std;
typedef long long ll;
const int N=250005;
int n,q;
int a[N],b[N];
struct node{
int l,r;
int sum,mn,mx,mxc;
}tr[N*4];
void merge(node &p,node x,node y){
p.sum=x.sum+y.sum;
p.mn=min(x.mn,y.mn);
p.mxc=max({x.mxc,y.mxc,abs(b[x.r]-b[y.l])});
}
void pushup(int p){
merge(tr[p],tr[ls],tr[rs]);
}
void build(int p,int l,int r){
tr[p]={l,r,0,0,0,0};
if(l==r){
tr[p].mn=tr[p].mx=b[l];
if(a[l]==b[l]) tr[p].sum=1;
return;
}
int mid=(l+r)/2;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p);
cout<<"build"<<tr[p].l<<" "<<tr[p].r<<" "<<tr[p].mn<<" "<<tr[p].mxc<<"\n";
}
node query(int p,int l,int r){
if(l<=tr[p].l&&tr[p].r<=r){
return tr[p];
}
int mid=(tr[p].l+tr[p].r)/2;
node lres,rres;
int l1=0,r1=0;
if(l<=mid){
lres=query(ls,l,r);
l1=1;
}
if(r>mid){
rres=query(rs,l,r);
r1=1;
}
if(!l1) return rres;
if(!r1) return lres;
node res;
merge(res,lres,rres);
res.l=lres.l,res.r=rres.r;
cout<<"res"<<res.l<<" "<<res.r<<" "<<res.mn<<" "<<res.mxc<<"\n";
return res;
}
void solve1(){
build(1,1,n);
while(q--){
int l,r;
cin>>l>>r;
l++,r++;
node res=query(1,l,r);
if(res.mn>1||res.mxc>1){
cout<<"0 ";
}
else cout<<"1 ";
cout<<"\n\n";
cout<<res.mn<<" "<<res.mxc<<" "<<res.sum<<"\n";
cout<<"\n\n";
}
}
void solve2(){
build(1,1,n);
while(q--){
int l,r;
cin>>l>>r;
l++,r++;
node res=query(1,l,r);
if(res.sum!=r-l+1){
cout<<"0 ";
}
else cout<<"1 ";
}
}
void solve3(){
while(q--){
int l,r;
cin>>l>>r;
l++,r++;
vector<int> vec;
for(int i=l;i<=r;i++){
vec.push_back(b[i]);
}
sort(vec.begin(),vec.end());
int f=1;
for(int i=0;i<vec.size()-1;i++){
if(vec[i+1]-vec[i]>1){
f=0;
}
}
if((!f)||vec[0]>1){
cout<<"0 ";
}
else{
cout<<"1 ";
}
}
}
int main(){
freopen("intervallavretni.in","r",stdin);
freopen("intervallavretni.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
int f1=1,f2=1;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
if(a[i]!=1) f1=0;
if(b[i]>2) f2=0;
}
if(f1){
if(n<=2000&&q<=2000){
solve3();
}
else solve1();
}
else if(f2){
solve2();
}
return 0;
}
/*
1:
7 3
1 3
1 4
1 1
1 2
1 1
1 3
1 3
0 3
0 6
1 3
*/