Pagini recente » Cod sursa (job #379043) | Cod sursa (job #795207) | Cod sursa (job #2839243) | Cod sursa (job #559110) | Cod sursa (job #901200)
Cod sursa(job #901200)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,ib,o[100005],v[100005],norm[100005],pre[100005],arb[100005],best[100005];
void updat(int u, int x)
{
for(;u<=n; u = u + ( ( u^(u-1)) & u ) )
if(best[x]>best[arb[u]]) arb[u]=x;
}
int quer(int x)
{
int maxi=0;
for(; x ; x = x - ( (x^(x-1)) & x) )
if(best[arb[x]]>best[maxi]) maxi=arb[x];
return maxi;
}
void afis(int i)
{
if(pre[i]) afis(pre[i]);
g<<o[i]<<' ';
}
int main()
{
int k,i;
f>>n;
for (int x=40; x <= n; x += ( x^(x-1) ) & x) g<<x<<'\n';
for(i=1;i<=n;++i) f>>v[i], o[i]=norm[i]=v[i];
sort(norm+1,norm+n+1);
k=1;
for(i=2;i<=n;++i) if(norm[i]!=norm[k]) norm[++k]=norm[i];
for(i=1;i<=n;++i) v[i]=lower_bound(norm+1,norm+k+1,v[i]) - norm;
ib=1;
for(i=1;i<=n;++i)
{
pre[i]=quer(v[i]-1);
best[i]=best[pre[i]]+1;
updat(v[i],i);
if(best[ib]<best[i]) ib=i;
}
g<<best[ib]<<'\n';
afis(ib);
g<<'\n';
f.close(); g.close();
return 0;
}