Cod sursa(job #763479)

Utilizator igsifvevc avb igsi Data 2 iulie 2012 13:42:05
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>
#define DIM 100001

struct list
{
    int value;
    struct list *next;
};

struct hash
{
    int min;
    struct list *next;
} best[DIM];

int maxSeq, seq[DIM], predecessor[DIM], n;
FILE *in, *out;

void print(int pos)
{
	if(predecessor[pos] != -1)
		print(predecessor[pos]);
	fprintf(out, "%d ", seq[pos]);
}

int main()
{
    int i, j, sw;
    struct list *p;
    
    in = fopen("scmax.in", "r");
    out = fopen("scmax.out", "w");
    	
    fscanf(in, "%d", &n);
    for(i = 0; i < n; ++i)
        fscanf(in, "%d", &seq[i]);

    for(i = 0; i < n; ++i)
    {
        for(j = maxSeq, sw = 1; j && sw;)
        {
            if(best[j].min < seq[i])
                 for(p = best[j].next; p && sw; p = p->next)
                     if(seq[p->value] < seq[i])
                     {
                         predecessor[i] = p->value;
                         sw = 0;
                     }
            if(sw) j--;
        }

        if(j == 0)
        {
            predecessor[i] = -1;
            p = malloc(sizeof(struct list));
            p->value = i;
            p->next = best[1].next;
            best[1].next = p;
            if(best[1].min == 0 || seq[i] < best[1].min) best[1].min = seq[i];
            if(!maxSeq) maxSeq = 1;
        }
        else
        {
			p = malloc(sizeof(struct list));
            p->value = i;
            p->next = best[j+1].next;
            best[j+1].next = p;
            if(best[j+1].min == 0 || seq[i] < best[j+1].min) best[j+1].min = seq[i];
            if(j+1 > maxSeq) maxSeq++;
        }
    }
    
    fprintf(out, "%d\n", maxSeq);
    print(best[maxSeq].next->value);
    fprintf(out, "\n");
    
	fclose(in);
	fclose(out);
    return 0;
}