【模板】回滚莫队&不删除莫队

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;
}

posted @ 2021-04-06 10:01  Troverld  阅读(52)  评论(0)    收藏  举报