II.【模板】回滚莫队&不删除莫队
莫,就硬莫。
代码:
#include<bits/stdc++.h>
using namespace std;
const int BBB=450;
int n,m,a[200100],mx[200100],mn[200100],ans,res[200100];
vector<int>v;
stack<pair<int,int> >s;
void Push(int x){
if(x>mx[a[x]])s.emplace(a[x],mx[a[x]]),mx[a[x]]=x;
if(x<mn[a[x]])s.emplace(-a[x],mn[a[x]]),mn[a[x]]=x;
ans=max(ans,mx[a[x]]-mn[a[x]]);
}
void Restore(){
if(s.top().first>0)mx[s.top().first]=s.top().second;
else mn[-s.top().first]=s.top().second;
s.pop();
}
struct query{
int l,r,id;
query(int L,int R,int ID){l=L,r=R,id=ID;}
friend bool operator<(const query&u,const query&v){return u.r<v.r;}
};
vector<query>u[500];
int read(){
int x=0;
char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x;
}
int main(){
n=read(),memset(mn,0x3f,sizeof(mn));
for(int i=0;i<n;i++)v.push_back(a[i]=read());
sort(v.begin(),v.end()),v.resize(unique(v.begin(),v.end())-v.begin());
for(int i=0;i<n;i++)a[i]=lower_bound(v.begin(),v.end(),a[i])-v.begin()+1;
m=read();
for(int i=1,l,r;i<=m;i++)l=read()-1,r=read()-1,u[l/BBB].emplace_back(l,r,i);
for(int i=0;i*BBB<n;i++){
sort(u[i].begin(),u[i].end());
int lim=min((i+1)*BBB,n);
int L=lim,R=L-1;ans=0;
for(auto x:u[i]){
if(x.r<lim){
for(int j=x.l;j<=x.r;j++)Push(j);
res[x.id]=ans,ans=0;
while(!s.empty())Restore();
continue;
}
while(R<x.r)Push(++R);
int tsz=s.size(),tas=ans;
while(L>x.l)Push(--L);
res[x.id]=ans,ans=tas,L=lim;
while(s.size()>tsz)Restore();
}
while(!s.empty())Restore();
}
for(int i=1;i<=m;i++)printf("%d\n",res[i]);
return 0;
}