#include<bits/stdc++.h>
using namespace std;
typedef long long int lli;
stack<pair<lli,int> > s;
lli arr[1000000];
int fforward[1000000];
int bbackward[1000000];
vector<lli> ans;
vector<pair<int,lli> > span;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
for(int i=0;i<n;i++)
{
//cout<<" going to use "<<arr[i]<<endl;
if( s.empty() || s.top().first<=arr[i] )
{
// cout<<" push"<<endl;;
s.push({arr[i],i});
}
else
{
while(!s.empty() && s.top().first>arr[i])
{
fforward[s.top().second]=(i-s.top().second);
// cout<<"pop "<<s.top().first<<" "<<" ans is "<<fforward[s.top().second]<<endl;
s.pop();
}
s.push({arr[i],i});
}
}
while(!s.empty())
{
fforward[s.top().second]=(n-s.top().second);
s.pop();
}
/*for(int i=0;i<n;i++) cout<<fforward[i]<<" ";
cout<<endl;*/
for(int i=n-1;i>=0;i--)
{
//cout<<" going to use "<<arr[i]<<endl;
if( s.empty() || s.top().first<=arr[i] )
{
// cout<<" push"<<endl;;
s.push({arr[i],i});
}
else
{
while(!s.empty() && s.top().first>arr[i])
{
bbackward[s.top().second]=(s.top().second-i);
// cout<<"pop "<<s.top().first<<" "<<" ans is "<<fforward[s.top().second]<<endl;
s.pop();
}
s.push({arr[i],i});
}
}
while(!s.empty())
{
bbackward[s.top().second]=(s.top().second+1);
s.pop();
}
for(int i=0;i<n;i++)
{
span.push_back({fforward[i]+bbackward[i]-1,arr[i]});
// cumulated[i]=fforward[i]+bbackward[i]-1;
}
// for(int i=0;i<n;i++)cout<<cumulated[i]<<" ";
//cout<<endl;
sort(span.begin(),span.end());
int start=n-1;
set<lli> sset;
for(int sp=n;sp>=1;sp--)
{
while(start>=0 && span[start].first>=sp)
{
sset.insert(span[start].second);
start--;
}
ans.push_back(*sset.rbegin());
}
for(int i=n-1;i>=0;i--) cout<<ans[i]<<" ";
}
using namespace std;
typedef long long int lli;
stack<pair<lli,int> > s;
lli arr[1000000];
int fforward[1000000];
int bbackward[1000000];
vector<lli> ans;
vector<pair<int,lli> > span;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
for(int i=0;i<n;i++)
{
//cout<<" going to use "<<arr[i]<<endl;
if( s.empty() || s.top().first<=arr[i] )
{
// cout<<" push"<<endl;;
s.push({arr[i],i});
}
else
{
while(!s.empty() && s.top().first>arr[i])
{
fforward[s.top().second]=(i-s.top().second);
// cout<<"pop "<<s.top().first<<" "<<" ans is "<<fforward[s.top().second]<<endl;
s.pop();
}
s.push({arr[i],i});
}
}
while(!s.empty())
{
fforward[s.top().second]=(n-s.top().second);
s.pop();
}
/*for(int i=0;i<n;i++) cout<<fforward[i]<<" ";
cout<<endl;*/
for(int i=n-1;i>=0;i--)
{
//cout<<" going to use "<<arr[i]<<endl;
if( s.empty() || s.top().first<=arr[i] )
{
// cout<<" push"<<endl;;
s.push({arr[i],i});
}
else
{
while(!s.empty() && s.top().first>arr[i])
{
bbackward[s.top().second]=(s.top().second-i);
// cout<<"pop "<<s.top().first<<" "<<" ans is "<<fforward[s.top().second]<<endl;
s.pop();
}
s.push({arr[i],i});
}
}
while(!s.empty())
{
bbackward[s.top().second]=(s.top().second+1);
s.pop();
}
for(int i=0;i<n;i++)
{
span.push_back({fforward[i]+bbackward[i]-1,arr[i]});
// cumulated[i]=fforward[i]+bbackward[i]-1;
}
// for(int i=0;i<n;i++)cout<<cumulated[i]<<" ";
//cout<<endl;
sort(span.begin(),span.end());
int start=n-1;
set<lli> sset;
for(int sp=n;sp>=1;sp--)
{
while(start>=0 && span[start].first>=sp)
{
sset.insert(span[start].second);
start--;
}
ans.push_back(*sset.rbegin());
}
for(int i=n-1;i>=0;i--) cout<<ans[i]<<" ";
}
No comments:
Post a Comment