Pagini recente » Cod sursa (job #1435044) | Cod sursa (job #1788677) | Cod sursa (job #2148343) | Cod sursa (job #2376070) | Cod sursa (job #763479)
Cod sursa(job #763479)
#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;
}