Pagini recente » Cod sursa (job #541955) | Cod sursa (job #1957163) | Cod sursa (job #2139977) | Cod sursa (job #1848260) | Cod sursa (job #2526450)
#include <stdio.h>
#define NMAX 100010
using namespace std;
FILE *f,*g;
int l[NMAX],x[NMAX],pred[NMAX],poz[NMAX],v[NMAX];
int BinarySearch(int value,int i)
{
int right=x[0],left=1,middle,P=-1;
while(left<=right)
{
middle=(left+right)/2;
if(x[middle]<value)
P=middle,left=middle+1;
else right=middle-1;
}
if(P==-1)x[1]=value,poz[1]=i;
else x[P+1]=value,poz[P+1]=i,pred[i]=poz[P];
if(P+1>x[0])++x[0];
if(P==-1)P=0;
return P;
}
void Displaying(int i)
{
int nr=0;
while(i)
{
poz[++nr]=v[i],i=pred[i];
}
while(nr)fprintf(g,"%d ",poz[nr--]);
}
int main()
{
f=fopen("scmax.in","r");g=fopen("scmax.out","w");
int X,i,n,P,max=1,pm;
fscanf(f,"%d",&n);
fscanf(f,"%d",&v[1]);
x[++x[0]]=v[1];poz[1]=1;l[1]=1;
for(i=2;i<=n;++i)
{
fscanf(f,"%d",&v[i]);
P=BinarySearch(v[i],i);
if(P+1==x[0])l[P+1]=l[P]+1;
if(l[P+1]>max)max=l[P+1],pm=i;
}
fprintf(g,"%d\n",max);
Displaying(pm);
fclose(f);fclose(g);
return 0;
}