Pagini recente » Cod sursa (job #2497717) | Cod sursa (job #2732961) | Cod sursa (job #1281359) | Cod sursa (job #2483707) | Cod sursa (job #2590485)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
#define N 100005
int n, a[N],d[N],k,p[N],afis[N];
void citire()
{
in>>n;
for(int i=1; i<=n; ++i)
in>>a[i];
}
int cauta(int st, int dr, int x)
{
int poz;
while(st<=dr)
{
int m=(st+dr)/2;
if(d[m]>=x)
poz=m,dr=m-1;
else st=m+1;
}
return poz;
}
void creare()
{
k=1;
p[1]=1;
d[1]=a[1];
for(int i=2; i<=n; ++i)
if(a[i]>d[k])
d[++k]=a[i],p[i]=k;
else
{
int poz=cauta(1,k,a[i]);
d[poz]=a[i],p[i]=poz;
}
out<<k<<endl;
for(int i=n; i&&k;--i)
if(p[i]==k)
afis[k--]=a[i];
while(afis[++k]) out<<afis[k]<<" ";
}
int main()
{
citire();
creare();
return 0;
}