Pagini recente » Cod sursa (job #2149661) | Cod sursa (job #293558) | Cod sursa (job #2008713) | Cod sursa (job #2107953) | Cod sursa (job #1909812)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define lim 100100
int n,ini[lim],dr,v[lim],aib[lim],maxm,act,dad[lim],lung[lim];
int best[lim];
int b_s(int val)
{
int pos=0,mask;
for(mask=1; mask<=n; mask<<=1);
for(; mask; mask>>=1)
if(pos+mask<=n)
if(aib[pos+mask]<=val)
pos+=mask;
return pos;
}
void normalizare()
{
sort(aib+1,aib+n+1);
for(int i=1; i<=n; i++)
v[i]=b_s(ini[i]);
}
void initializare()
{
for(int i=0; i<=n; i++)
aib[i]=0;
}
int query(int posini)
{
int rez=0,ind=0;
for(int pos=posini; pos; pos-=(pos&(-pos)))
{
if(rez < best[aib[pos]])
{
rez = best[aib[pos]];
ind = aib[pos];
}
}
return ind;
}
void update(int pos, int ind)
{
for(; pos<=n; pos+=(pos&(-pos)))
if(best[ind] > best[aib[pos]])
aib[pos] = ind;
}
void drum(int k)
{
if(dad[k])
{
drum(dad[k]);
fout<<ini[k]<<' ';
}
else
fout<<ini[k]<<' ';
}
int main()
{
fin>>n;
for(int i=1; i<=n; i++)
fin>>ini[i], aib[i]=ini[i];
normalizare();
initializare();
maxm=-1;
int posAnt;
for(int i=1; i<=n; i++)
{
posAnt = query(v[i]-1);
dad[i] = posAnt;
best[i] = best[posAnt] + 1;
if(best[i] > maxm)
maxm=best[i], dr=i;
update(v[i],i);
}
fout<<maxm<<'\n';
drum(dr);
// for(int i=1; i<=n; i++)
// fout<<dad[i]<<' ';
fin.close();
fout.close();
return 0;
}