Pagini recente » Cod sursa (job #552860) | Cod sursa (job #922717) | Cod sursa (job #1889357) | Cod sursa (job #664312) | Cod sursa (job #1994819)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,a[100010],b[100010],c[100010],d[100010],crt,poz,maxi,l;
int bsearch2 (int p, int u, int key)
{
int m;
while (p < u)
{
m = (p + u) / 2;
if(c[m]>key && c[m-1]<=key) return m;
else if (c[m] < key)
p = m + 1;
else
u = m;
}
m = (p + u) / 2;
if (c[m] < key)
++ m;
return m;
}
int main()
{
f>>n;
l=0;
for(int i=1; i<=n; i++)
{
f>>a[i];
}
for(int i=1; i<=n; i++)
{
if(a[i]>c[l]) {l++; c[l]=a[i]; b[i]=++maxi;}
else
{
c[bsearch2(1,l,a[i])]=a[i];
b[i]=bsearch2(1,l,a[i]);
}
}
maxi=0;
for(int i=1; i<=n; i++)
if(maxi<b[i]) {maxi=b[i]; poz=i;}
g<<maxi<<'\n';
d[1]=a[poz]; int k=1;
for(int i=poz; i>0; i--)
{
if(a[poz]>a[i] && b[poz]>b[i]) {k++; d[k]=a[i]; poz=i;}
}
for(int i=k; i>0; i--)
g<<d[i]<<' ';
g<<'\n';
return 0;
}