Pagini recente » Cod sursa (job #528882) | Cod sursa (job #1437364) | Cod sursa (job #2740927) | Cod sursa (job #1802430) | Cod sursa (job #1073230)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define MAX 101000
int AIB[MAX], cpy[MAX], a[MAX], v[MAX], n, rez[MAX], dad[MAX];
int cauta(int p)
{
int s=0;
while(p)
{
if(rez[AIB[p]]>rez[s])
{
s=AIB[p];
}
p-=(p^(p&(p-1)));
}
return s;
}
int introdu(int nr, int p)
{
while(p<=n)
{
if(rez[AIB[p]]<rez[nr])
{
AIB[p]=nr;
}
p+=(p^(p&(p-1)));
}
}
void af(int nod)
{
if(!nod)
return;
af(dad[nod]);
fout<<cpy[nod]<<" ";
}
int main()
{
fin>>n;
int i;
for(i=1;i<=n;i++)
{
fin>>cpy[i];
a[i]=cpy[i];
}
sort(a+1, a+n+1);
for(i=1;i<=n;i++)
{
v[i]=lower_bound(a+1, a+n+1,cpy[i])-a;
}
for(i=1;i<=n;i++)
{
dad[i]=cauta(v[i]-1);
rez[i]=rez[dad[i]]+1;
introdu(i, v[i]);
}
int s=1;
for(i=1;i<=n;i++)
{
if(rez[s]<rez[i])
s=i;
}
fout<<rez[s]<<"\n";
af(s);
}