Pagini recente » Cod sursa (job #3271098) | Cod sursa (job #2435316) | Cod sursa (job #2377688) | Cod sursa (job #1877994) | Cod sursa (job #1660161)
#include<iostream>
#include<fstream>
#include<cstdio>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,a[100005],poz[100005],v[100005],sol[100005];
void Citire()
{
fin>>n;
for (int i=1;i<=n;i++)
fin>>a[i];
}
void Formeaza()
{
int i,st,dr,mij,lg=1,maximpoz,maxim,aux;
poz[1]=1;
v[1]=a[1];maximpoz=maxim=1;
for (i=2;i<=n;i++)
{
st=1;dr=lg;
if (a[i]>v[dr])
{
lg++;
mij=lg;
}
else if (a[i]<=v[st]) mij=1;
else while (st<=dr)
{
mij=(st+dr)/2;
if (v[mij]>=a[i] && v[mij-1]<a[i]) st=dr+1;
else if (v[mij]>a[i]) dr=mij-1;
else st=mij+1;
}
v[mij]=a[i];
poz[i]=mij;
if (mij>maxim)
{
maxim=mij;
maximpoz=i;
}
}
//formez sirul
aux=maxim;
fout<<maxim<<"\n";
sol[maxim]=a[maximpoz];
maxim--;
for (i=maximpoz-1;i>=1 && maxim;i--)
if (poz[i]==maxim)
{
sol[maxim]=a[i];
maxim--;
}
for (i=1;i<=aux;i++)
fout<<sol[i]<<" ";
fout<<"\n";
}
int main()
{
Citire();
Formeaza();
return 0;
}