Pagini recente » Borderou de evaluare (job #908049) | Cod sursa (job #2148877) | Cod sursa (job #142210) | Cod sursa (job #2727113) | Cod sursa (job #413353)
Cod sursa(job #413353)
#include<stdio.h>
#define MAX 100003
int M[MAX],p[MAX],v[MAX],nr,n,best[MAX],maxim;
FILE*g=fopen("scmax.out","w");
void afis(int poz)
{
if(poz>0){afis(p[poz]);
fprintf(g,"%d ",v[poz]);}
}
int cauta(int x)
{
int lo=0,hi=nr,mid=(lo+hi)/2;
while(lo<=hi)
{
if(v[M[mid]]<x&&v[M[mid+1]]>=x)return mid;
else if(v[M[mid+1]]<x){lo=mid+1;mid=(lo+hi)/2;}
else{hi=mid-1;mid=(lo+hi)/2;}
}
return nr;
}
int main()
{
FILE*f=fopen("scmax.in","r");
fscanf(f,"%d",&n);
int i,poz,maxP;
for(i=1;i<=n;++i)
fscanf(f,"%d",&v[i]);
fclose(f);
best[1]=M[1]=nr=1;
maxim=maxP=1;
for(i=2;i<=n;++i)
{
poz=cauta(v[i]);
p[i]=M[poz];
best[i]=poz+1;
if(best[i]>maxim)
{maxim=best[i];maxP=i;}
M[poz+1]=i;
if(nr<poz+1)nr=poz+1;
}
fprintf(g,"%d\n",maxim);
afis(maxP);
fclose(g);
return 0;
}