Pagini recente » Cod sursa (job #1067136) | Cod sursa (job #1725266) | Solutii preONI 2007, Runda 1 | Cod sursa (job #1029999) | Cod sursa (job #700882)
Cod sursa(job #700882)
#include<fstream>
#define NMAX 100010
#define INF 2000000100
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int a[NMAX], lg[NMAX], pz[NMAX], b[NMAX], bpz[NMAX], n, m;
void Citeste()
{
int i;
f>>n;
for (i=1; i<=n; ++i) { f>>a[i]; b[i]=INF;}
}
int cauta(int x)
{
int st=1, dr=m, j=m, mij, ok=0;
while (st<=dr && !ok)
{
mij=(st+dr)>>1;
if (b[mij]==x) ok=mij;
else if (b[mij]<x) st=mij+1;
else dr=mij-1, j=mij;
}
if (ok!=0) return -ok;
else return j;
}
void Scrie(int x)
{
if (pz[x])
{
Scrie(pz[x]);
g<<a[x]<<" ";
}
if (!pz[x]) g<<a[x]<<" ";
}
void Solve()
{
int i, mx=-1, im, c;
m=1;
for (i=1; i<=n; ++i)
{
c=cauta(a[i]);
if (c==m) ++m;
if (c>0)
{
b[c]=a[i]; b[m]=INF;
bpz[c]=i; lg[i]=c; pz[i]=bpz[c-1];
if (c>mx) mx=c, im=i;
}
}
g<<mx<<"\n";
Scrie(im);
g<<"\n";
}
int main()
{
Citeste();
Solve();
f.close();
g.close();
return 0;
}