Cod sursa(job #2627043)

Utilizator lucidanescu28Danescu Lucian lucidanescu28 Data 9 iunie 2020 14:28:38
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){
    FILE *fin = fopen("scmax.in", "r");
    FILE *fout = fopen("scmax.out", "w");
    FILE *aux = fopen("sir1.out", "w");
    int n, a[100000], max, start;

    fscanf(fin, "%d", &n);
    for(int i = 0; i < n; i++)
        fscanf(fin, "%d", &a[i]);
    
    int *D = malloc(n * sizeof(int));
    int *P = malloc(n * sizeof(int));
    int size = 0;
    D[size++] = a[0];
    P[0] = 1;


    for(int i = 1; i < n; i++){
        if(a[i] > D[size - 1]){
            D[size++] = a[i];
            P[i] = size;
        }
        else{
            int lt = 0, rt = size - 1, poz;

            while(lt <= rt){
                int mid = (lt + rt) / 2;

                if(D[mid] >= a[i]){
                    poz = mid;
                    rt = mid - 1;
                }
                else lt = mid + 1;
            }
            D[poz] = a[i];
            P[i] = poz + 1;
        }
    }

    max = 0;
    for(int i = 0; i < n; i++)
        if(P[i] > max){
            max = P[i];
            start = i;
        }

    int *ans = malloc(max * sizeof(int));
    ans[--max] = a[start];

    while(max){
        for(int i = 0; i < start; i++)
            if(P[i] == P[start] - 1 && a[i] < a[start]){
                ans[--max] = a[i];
                start = i;
                break;
            }
    }

    fprintf(fout, "%d\n", size);
    for(int i = 0; i < size; i++)
        fprintf(fout, "%d ", ans[i]);
    fprintf(fout, "\n");

    free(ans);
    free(D);
    free(P);
    fclose(fin);
    fclose(fout);

    
}