Pagini recente » Cod sursa (job #2042207) | Cod sursa (job #2362827) | Cod sursa (job #657451) | Cod sursa (job #2151153) | Cod sursa (job #1684616)
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
int H[3200005],best[100005],nr[100005],i,N,indice[100005],maxim,c,p,rez[100005];
int detbest(int nod)
{
if(nod>H[0])
return 0;
if(nr[H[nod]]<nr[i])
{indice[i]=H[nod];return H[nod];}
if(2*nod<=N&&2*nod+1<=N)
{
int a=0,b=0;
if(best[H[2*nod]]>indice[i])
a=detbest(2*nod);
if(best[H[2*nod+1]]>indice[i])
b=detbest(2*nod+1);
if(best[a]>best[b])
b=a;
if(best[b]>best[indice[i]])
{indice[i]=b;return b;}
}
if(2*nod<=N)
{
int b=0;
if(best[H[2*nod]]>indice[i])
b=detbest(2*nod);
if(best[b]>best[indice[i]])
{indice[i]=b;return b;}
}
return 0;
}
int main()
{
fscanf(f,"%d",&N);
for(i=1;i<=N;i++)
{
fscanf(f,"%d",&nr[i]);
detbest(1);
best[i]=best[indice[i]]+1;
if(best[i]>best[maxim])
maxim=i;
H[++H[0]]=i;
c=H[0];
p=c/2;
while(best[H[p]]<best[H[c]]&&p>0)
{swap(H[c],H[p]);c=p;p=c/2;}
p=c;
while(1)
{
c=2*p;
if(c>H[0])
break;
if(best[H[c+1]]>best[H[c]]&&c+1<=H[0])
c=c+1;
if(best[H[c]]<best[H[p]])
break;
swap(H[p],H[c]);
p=c;
}
}
fprintf(g,"%d\n",best[maxim]);
while(maxim!=0)
{
rez[++rez[0]]=maxim;
maxim=indice[maxim];
}
for(i=rez[0];i>0;i--)
fprintf(g,"%d ",nr[rez[i]]);
fclose(f);
fclose(g);
return 0;
}