Pagini recente » Cod sursa (job #1143281) | Cod sursa (job #2633589) | Cod sursa (job #2649849) | Cod sursa (job #2743835) | Cod sursa (job #2056135)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("subsir2.in");
ofstream g ("subsir2.out");
int n,a[100001],b[100001],lmax,i,l[100001],k;
void citire()
{
f>>n;
for(i=1; i<=n; i++)
f>>a[i],b[i]=1000000001;
}
int caut(int x)
{
int mij,p=1,u=n;
while(p<=u)
{
mij=(p+u)/2;
if(b[mij]<=x) p=mij+1;
else u=mij-1;
}
return u;
}
void solve()
{
int i,p;
for(i=1; i<=n; i++)
{
p=caut(a[i]);
if(a[i]<b[p+1]) {b[p+1]=a[i]; l[i]=p+1;
}
if(p+1>=lmax) {lmax=p+1; k=i;}
}
}
void drum(int k)
{
int j;
for(j=k;j>=1 && lmax; j--)
if(l[j]==lmax && a[j]<=a[k])
{
k=j;
lmax--;
drum(k);
g<<a[k]<<" ";
}
}
int main()
{
citire();
solve();
g<<lmax<<'\n';
drum(lmax);
return 0;
}