Submission #1341070

#TimeUsernameProblemLanguageResultExecution timeMemory
1341070PieArmyExponents (BOI25_exp)C++20
100 / 100
351 ms123088 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)

int n,q;
int arr[300023];
int lg[300023];
int table[300023][19];
pair<int,int>sor[300023];
int ans[300023];
vector<int>v[1000023];
int iki[1000023];

int query(int l,int r){
	if(l>r)return 0;
	int s=lg[r-l+1];
	int a=table[l][s];
	int b=table[r+1-(1<<s)][s];
	if(arr[b]>=arr[a])return b;
	return a;
}

pair<vector<pair<int,int>>,vector<pair<int,int>>> dfs(int left,int right){
	int mx=arr[query(left,right)];
	int p=right+1;
	vector<vector<pair<int,int>>>pre,su;
	vector<int>ps;
	while(p>left){
		int p2=query(left,p-1);
		if(arr[p2]!=mx){
			auto res=dfs(left,p-1);
			pre.pb(res.fr);
			su.pb(res.sc);
			break;
		}
		if(p2!=p-1){
			auto res=dfs(p2+1,p-1);
			pre.pb(res.fr);
			su.pb(res.sc);
		}
		p=p2;
		ps.pb(p);
		pre.pb({{p,p}});
		su.pb({{p,p}});
	}
	reverse(ps.begin(),ps.end());
	reverse(pre.begin(),pre.end());
	reverse(su.begin(),su.end());
	vector<pair<int,int>>pref,suf;
	for(int i=0;i<pre.size();i++){
		int mx2=arr[query(pre[i][0].fr,pre[i].back().sc)];
		if(mx2==mx){
			pref.pb(pre[i][0]);
			continue;
		}
		int kalan=0,las;
		for(int j=0;j<pre[i].size();j++){
			if(kalan==0){
				las=pre[i][j].fr;
				kalan=iki[mx-mx2];
			}
			kalan--;
			if(kalan==0||j+1==pre[i].size()){
				pref.pb({las,pre[i][j].sc});
				continue;
			}
		}
	}
	for(int i=su.size()-1;i>=0;i--){
		int mx2=arr[query(su[i][0].fr,su[i].back().sc)];
		if(mx2==mx){
			suf.pb(su[i][0]);
			continue;
		}
		int kalan=0,las;
		for(int j=su[i].size()-1;j>=0;j--){
			if(kalan==0){
				las=su[i][j].sc;
				kalan=iki[mx-mx2];
			}
			kalan--;
			if(kalan==0||j==0){
				suf.pb({su[i][j].fr,las});
				continue;
			}
		}
	}
	reverse(suf.begin(),suf.end());
	//cerr<<left<<":"<<right<<" "<<mx<<endl;
	while(v[mx].size()&&sor[v[mx].back()].fr>=left){
		int ind=v[mx].back();
		v[mx].pop_back();
		//cerr<<sor[ind].fr<<"-"<<sor[ind].sc<<endl;
		int l=0,r=pref.size()-1;
		while(l<r){
			int mi=(l+r+1)/2;
			if(pref[mi].fr<=sor[ind].sc)l=mi;
			else r=mi-1;
		}
		int son=l;
		l=0;r=suf.size()-1;
		while(l<r){
			int mi=(l+r)/2;
			if(suf[mi].sc>=sor[ind].fr)r=mi;
			else l=mi+1;
		}
		int ilk=l;
		int o=lower_bound(suf.begin(),suf.end(),suf[ilk])->fr;
		l=0;r=pref.size()-1;
		while(l<r){
			int mi=(l+r)/2;
			if(pref[mi].fr>=o)r=mi;
			else l=mi+1;
		}
		int top=son-l;
		l=0;r=suf.size()-1;
		while(l<r){
			int mi=(l+r)/2;
			if(suf[mi].fr>=o)r=mi;
			else l=mi+1;
		}
		top+=l-ilk+1;
		ans[ind]=mx;
		while(top>1){
			ans[ind]++;
			top=(top+1)/2;
		}
	}
	return {pref,suf};
}

signed main(){
	ios_base::sync_with_stdio(23^23);cin.tie(0);
	cin>>n>>q;
	iki[0]=1;
	for(int i=1;i<=1000020;i++){
		iki[i]=min(iki[i-1]*2,n);
	}
	for(int i=1;i<=n;i++){
		cin>>arr[i];
	}
	for(int i=1;i<=q;i++){
		cin>>sor[i].fr>>sor[i].sc;
	}
	lg[0]=-1;
	for(int i=1;i<=n;i++){
		table[i][0]=i;
		lg[i]=lg[i/2]+1;
	}
	for(int i=1;i<19;i++){
		for(int j=1;j<=n;j++){
			table[j][i]=table[j][i-1];
			if(j+(1<<(i-1))<=n){
				if(arr[table[j][i]]<=arr[table[j+(1<<(i-1))][i-1]]){
					table[j][i]=table[j+(1<<(i-1))][i-1];
				}
			}
		}
	}
	for(int i=1;i<=q;i++){
		v[arr[query(sor[i].fr,sor[i].sc)]].pb(i);
	}
	for(int i=0;i<=1e6;i++){
		sort(v[i].begin(),v[i].end(),[&](const int &x,const int &y){
			return sor[x].sc<sor[y].sc;
		});
	}
	dfs(1,n);
	for(int i=1;i<=q;i++){
		cout<<ans[i]<<endl;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...