#include <bits/stdc++.h>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 3e5+10;
int a[N];
int tree[N];
int lowbit(int x)
{
return x&-x;
}
void add(int x,int v)
{
while(x<=N-10)
{
tree[x]+=v;
x += lowbit(x);
}
}
int query(int x)
{
int res = 0;
while(x>0)
{
res += tree[x];
x -= lowbit(x);
}
return res;
}
int main()
{
int q;
cin>>q;
int ans = 1;
int cnt = 0;
while(q--)
{
int l,r;
cin>>l>>r;
int sum = query(r)-query(l-1);
if(sum==0)
{
for(int i=l;i<=r;i++)
{
add(i,i-l+1);
cnt += r-l+1;
}
if(cnt!=N-10)ans = max(r-l+2,ans);
else ans = max(r-l+1,ans);
}
cout<<ans<<endl;
}
return 0;
}
题解应该没人用树状数组罢,直接使用树状数组查询区间累加和,为0则暴力修改,否则就跳过,直接输出当前最大值

京公网安备 11010502036488号