Pagini recente » Cod sursa (job #684451) | Cod sursa (job #2963026) | Cod sursa (job #2805048) | Cod sursa (job #2440021) | Cod sursa (job #2375356)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX=100005;
const int INF=(1<<30);
int N,x,last;
int a[NMAX],aux[NMAX],prec[NMAX];
int cautare(int st , int dr , int val)
{
if(st>dr) return 0;
int m=(st+dr)/2;
if(a[aux[m]]<val) return max(m,cautare(m+1,dr,val));
else
return cautare(st,m-1,val);
}
void read()
{
fin>>N;
for(int i=1;i<=N;++i)
{
fin>>a[i];
}
}
void afis(int poz)
{
if(prec[poz]==poz) return;
afis(prec[aux[poz]]);
fout<<a[aux[poz]]<<" ";
}
void solve()
{
a[0]=-INF;
a[N+1]=INF;
aux[0]=0;
last=0;
int x;
for(int i=1;i<=N;++i)
{
if(a[i]>a[aux[last]])
{
aux[++last]=i;
prec[i]=last-1;
}
else
{
x=cautare(1,last,a[i]);
if(a[aux[x+1]]>a[i]) aux[x+1]=i;
prec[i]=aux[x];
}
}
fout<<last<<"\n";
afis(last);
}
int main()
{
read();
solve();
return 0;
}