Cod sursa(job #49978)

Utilizator flo_demonBunau Florin flo_demon Data 6 aprilie 2007 18:08:14
Problema Subsir 2 Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>

#define MAX 6000

int n, a[MAX], v[MAX];
int st, dr, mijl, L, last;
bool found;

int main()
{
    FILE *fin = fopen("subsir2.in", "r");
    fscanf(fin, "%d", &n);
    for (int i = 1; i <= n; ++i)
        fscanf(fin, "%d", &a[i]);
    fclose(fin);
    
    for (int i = 1; i <= n; ++i)
    {
        st = 1;
        dr = L;
        found = false;
        while (st <= dr)
        {
            mijl = (st + dr) / 2;
            if (a[ v[mijl] ] <= a[i])
            {
                st = mijl + 1;
                last = mijl;
                found = true;
            }
            else
                dr = mijl - 1;
        }
        if (!found)
            last = 0;
        if (last == L || a[i] <= a[ v[last+1] ])
        {
            if (a[i] < a[ v[last+1] ])
                v[last+1] = i;
            else
                if (a[i] == a[ v[last+1] ])
                {
                    if (v[last+1] > i)
                        v[last+1] = i;
                }
                else
                    v[last+1] = i;
            if (L < last + 1)
                L = last + 1;
        }
    }
    
    FILE *fout = fopen("subsir2.out", "w");
    fprintf(fout, "%d\n", L);
    for (int i = 1; i <= L; ++i)
        fprintf(fout, "%d ", v[i]);
    fclose(fout);
    
    return 0;
}