Pagini recente » Cod sursa (job #678132) | Cod sursa (job #709659) | Cod sursa (job #2499665) | Cod sursa (job #1401676) | Cod sursa (job #2375366)
#include <bits/stdc++.h>
#define INF (1<<30)
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int lg[100001],pre[100001],aux[100001];
int a[100001],n;
void read()
{fin>>n;
for(int i = 1 ; i <= n ; i ++)
fin >> a[i];
}
int BinSearch( int lf, int rg, int val )
{
if( lf > rg ) return 0;
int mid = ( lf + rg ) / 2;
if( val > a[ aux[mid] ] ) return max( mid, BinSearch( mid + 1, rg, val ) );
else return BinSearch( lf, mid - 1, val );
}
void Remake( int idx )
{
if( pre[idx] > 0 ) Remake( pre[idx] );
fout << a[idx] << ' ';
}
void Do()
{
a[0] = -INF;
a[n + 1] = INF;
aux[0] = 0;
int last = 0,poz;
for(int i=1;i<=n;i++)
{
if(a[i] >a[aux[last]])
{aux[ ++ last ] =i;
pre[i] = aux[last - 1];
}
else
{
poz = BinSearch(1 , last , a[i]);
pre[i] = aux[poz] ;
aux[poz + 1] = i;
}
}
//or(int i = 1 ; i <= poz ; i ++ )
//cout<<aux[i]<<" ";
fout<<last<<"\n";
Remake(aux[last]);
}
int main()
{
read();
Do();
return 0;
}