Pagini recente » Cod sursa (job #929029) | Cod sursa (job #2349068) | Cod sursa (job #1605906) | Cod sursa (job #738518) | Cod sursa (job #1470976)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100005
FILE *out;
int n, i,poz, a[MAXN], p[MAXN], best[MAXN],L[MAXN], nr;
void afis(int ind)
{
if(p[ind]) afis(p[ind]);
fprintf(out, "%d ", a[ind]);
}
int cauta(int val)
{
int p = 0, u = nr, m = (p+u)/2;
while(p <= u)
if(a[L[m]] < val && val <= a[L[m+1]]) return m;
else if(a[L[m+1]] < val){p = m+1, m =(p+u)/2;}
else {u = m-1, m = (p+u)/2;}
return nr;
}
int main()
{
FILE *in = fopen("scmax.in", "r");
out = fopen("scmax.out", "w");
fscanf(in, "%d", &n);
for(i = 1; i <= n; i++)
fscanf(in,"%d", a+i);
best[1] = L[1] = nr = 1; L[0] = 0;
for(i = 2; i <= n; i++)
{
poz = cauta(a[i]);//cel mai lung subsir format din elemente mai mici decat a[i] care se afla la stanga
p[i] = L[poz];
best[i] = poz + 1;
L[poz + 1] = i;
if(poz + 1 > nr) nr = poz + 1;
}
int maxim = -1, ind = 0;
for(i = 1; i <= n; i++)
if(best[i] > maxim) maxim = best[i], ind = i;
fprintf(out, "%d\n", maxim);
afis(ind);
return 0;
}