Pagini recente » Cod sursa (job #1475747) | Cod sursa (job #751672) | Cod sursa (job #1258972) | Cod sursa (job #989065) | Cod sursa (job #2569171)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,poz,nr,v[100005],l[100005],best[100005],p[100005],afis[100005];
int cb(int x)
{
int st=0, dr=nr, mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[l[mij]]<x && v[l[mij+1]]>=x) return mij;
else if(v[l[mij]]<x) st=mij+1;
else dr=mij-1;
}
return nr;
}
int main()
{
int i;
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i];
best[1]=l[1]=1;
nr=1;
///best[i] = lungimea max a unui sc care se termina cu i
///l = indicii elem din sir
///p = indicele elem precedent
for(i=2;i<=n;i++)
{
poz=cb(v[i]);
p[i]=l[poz];
best[i]=poz+1;
l[poz+1]=i;
nr=max(nr,poz+1);
}
int maxi=poz=0;
for(i=1;i<=n;i++)
if(maxi<best[i]) {maxi=best[i], poz=i;}
fout<<maxi<<'\n';
int len=maxi;
for(i=poz;p[i];i=p[i]) afis[--maxi]=v[i];
afis[0]=v[i];
for(i=0;i<len;i++) fout<<afis[i]<<' ';
return 0;
}