Cod sursa(job #1470976)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 12 august 2015 19:04:33
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#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;
}