#include <iostream>
using namespace std;
const int N=3e5,block=550;
int a[N+block],bl[N+block];
bool b[block],ans[N+block];
int lb(int x){ return (x-1)*block+1;}
int rb(int x){ return x*block;}
bool check(int l,int r)
{
int L=bl[l],R=bl[r];
if(L==R){ for(int i=l;i<=r;++i)if(a[i])return 1; return 0;}
for(int i=l;i<=rb(L);++i)if(a[i])return 1;
for(int i=L+1;i<=R-1;++i)if(b[i])return 1;
for(int i=lb(R);i<=r;++i)if(a[i])return 1;
return 0;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
int q,Ans=1; cin>>q; for(int i=1;i<=N;++i)bl[i]=(i-1)/block+1;
for(int T=1;T<=q;++T)
{
int l,r; cin>>l>>r;
if(!check(l,r))
for(int i=l;i<=r;++i)
{
a[i]=i-l+1,b[bl[i]]=1;
if(ans[i-l+1])continue;
ans[i-l+1]=1; ++Ans;
}
cout<<Ans<<'\n';
}
return 0;
}
注意到改变数组中的数此操作总复杂度是3e5的 只需控制操作检查区间是否全为0的复杂度即可

京公网安备 11010502036488号