Pagini recente » Cod sursa (job #2726082) | Cod sursa (job #2032475) | Cod sursa (job #2608136) | Cod sursa (job #2590923) | Cod sursa (job #2076922)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, nr=1, maxim, s[100003], best[100003], prev[100003], l[100003];
void scrie(int k)
{
if(prev[k]!=0) scrie(prev[k]);
fout<<s[k]<<' ';
}
int bs(int x)
{
int st, dr, mijl;
st=0, dr=nr;
while(st<=dr)
{
mijl=(st+dr)/2;
if(s[l[mijl]]<x && s[l[mijl+1]]>=x)
return mijl;
if(s[l[mijl]]<x)
st=mijl+1;
else
dr=mijl-1;
}
return nr;
}
int main()
{
int i, poz;
fin>>n;
for(i=1; i<=n; i++)
fin>>s[i];
best[1]=1;
l[1]=1;
for(i=2; i<=n; i++)
{
poz=bs(s[i]);
prev[i]=l[poz];
best[i]=poz+1;
l[poz+1]=i;
if(nr<poz+1)
nr=poz+1;
}
for(i=1; i<=n; i++)
if(maxim<best[i])
maxim=best[i], poz=i;
fout<<maxim<<'\n';
scrie(poz);
return 0;
}