Cod sursa(job #1130353)

Utilizator vladvaldezVlad Dimulescu vladvaldez Data 28 februarie 2014 12:44:03
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <stdio.h>

using namespace std;
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");

int n,v[100005],b[100005],s[100005],i,j,poz,mx,o;

int cautb(int x)
{int p=1,u=b[0],m,nr=0;

while(p<=u)
{
m=(p+u)/2;
if (b[m]<x)
{
if (m>nr)nr=m;
p=m+1;
}
else u=m-1;
}
return nr;
}


void solve(int pos,int nr)
{int p=pos-1;
if(nr-1>0)
{
while(s[p]!=nr-1)p--;
solve(p,nr-1);
}
fprintf(g,"%d ",v[pos]);
}
int main()
{
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
fscanf(f,"%d",&v[i]);
b[1]=v[1];
b[0]=1;
s[1]=1;
for(i=2;i<=n;i++)
{
 poz=cautb(v[i]);
 if (poz==b[0]){b[poz+1]=v[i];b[0]++;}
 else b[poz+1]=v[i];
 s[i]=poz+1;
}

for(i=1;i<=n;i++)
if (s[i]>mx){mx=s[i];o=i;}
fprintf(g,"%d\n",mx);

solve(o,mx);

fclose(g);
return 0;
}