Pagini recente » Cod sursa (job #1699411) | Cod sursa (job #1297505) | Cod sursa (job #2371035) | Cod sursa (job #889188) | Cod sursa (job #2526413)
#include <stdio.h>
using namespace std;
FILE *f,*g;
int l[100010],x[100010],sol[100010],nr,added;
int BinarySearch(int value,int i)
{
int right=x[0],left=1,middle,P=-1;
added=false;
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,sol[1]=value;
else x[P+1]=value;
if(P+1>x[0])++x[0],added=true;
return P;
}
void Displaying()
{
int i;
for(i=1;i<=nr;++i)fprintf(g,"%d ",sol[i]);
}
int main()
{
f=fopen("scmax.in","r");g=fopen("scmax.out","w");
int X,i,n,P,max=1;
fscanf(f,"%d",&n);
fscanf(f,"%d",&X);
x[++x[0]]=X;l[1]=1;sol[++nr]=X;
for(i=2;i<=n;++i)
{
fscanf(f,"%d",&X);
P=BinarySearch(X,i);
if(P+1==x[0])
{
l[P+1]=l[P]+1;
if(added==true)++nr,sol[nr]=X;
else sol[nr]=X;
}
if(l[P+1]>max)max=l[P+1];
}
fprintf(g,"%d\n",max);
Displaying();
fclose(f);fclose(g);
return 0;
}