Pagini recente » Cod sursa (job #3284653) | Cod sursa (job #2986923) | Cod sursa (job #2367358) | Cod sursa (job #3142432) | Cod sursa (job #2532535)
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void read(int &n,int *v)
{
fin>>n;
for(int i=0;i<n;++i)
fin>>v[i];
}
int getPos(int x,int *v,int n,int *a)
{
int l=1,r=n-1;
while(l<r-1)
{
int m=(l+r)/2;
if(a[v[m]]>=x)
r=m;
else
l=m;
}
if(a[v[l]]<x)
return r;
return l;
}
int main()
{
int n,m,a[NMAX],b[NMAX];
read(n,a);
//read(m,b);
int best[NMAX],prec[NMAX],k=2;
best[1]=0;
best[0]=prec[0]=-1;
for(int i=1;i<n;++i)
{
if(a[i]>a[best[k-1]])
{
best[k]=i;
prec[i]=best[k-1];
++k;
}
else
{
int pos=getPos(a[i],best,k,a);
best[pos]=i;
prec[i]=best[pos-1];
}
}
int last=best[k-1],nr=k-1;
do
{
b[nr--]=a[last];
last=prec[last];
}while(prec[last]!=-1);
b[nr]=a[last];
for(int i=1;i<k;++i)
fout<<b[i]<<' ';
return 0;
}