Mai intai trebuie sa te autentifici.
Cod sursa(job #1523908)
Utilizator | Data | 13 noiembrie 2015 14:27:24 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 15 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.41 kb |
#include <iostream>
#include <cstdio>
# include <vector>
using namespace std;
int a[100010],t[100010],l[100010],val[100010];
int indice[100010],k;
FILE *f=fopen("scmax.in","r");
FILE *f1=fopen("scmax.out","w");
int caut_binar(int s, int d,int nr)
{
int m;
if(s>d)
return m;
else
{
m =(s+d)/2;
if(nr<val[m]&&nr>val[m-1])
return m;
if(nr<val[m-1])
return caut_binar(s,m-1,nr);
return caut_binar(m+1,d,nr);
}
}
void scmax(int a[100010],int n)
{
val[1]=a[1];
l[1]=1;
indice[1]=1;
k=1;
int nr;
for(int i=2;i<=n;i++)
{
nr=a[i];
if(nr>val[k])
{
val[++k]=nr;
l[k]=l[k-1]+1;
indice[k]=i;
t[i]=indice[k-1];
}
else
{
int c=caut_binar(1,k,nr);
val[c]=nr;
indice[c]=i;
t[i]=indice[k-1];
}
}
}
void restoration( )
{
int i=indice[k];
int q=0;
while(i)
{
val[++q]=a[i];
i=t[i];
}
for(i=q;i>=1;i--)
fprintf(f1,"%d ",val[i]);
}
int main()
{
int n,i;
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(f,"%d",&a[i]);
}
scmax(a,n);
fprintf(f1,"%d\n",l[k]);
restoration( );
return 0;
}