Thursday, 28 April 2016

***D. Mike and Feet( FIND MAXIMUM OF SLIDING FROM 1 TO N )

#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]<<" ";

 }

No comments:

Post a Comment