Cod sursa(job #2752157)

Utilizator MaxamPJORares Daniel MaxamPJO Data 16 mai 2021 21:57:26
Problema Subsir crescator maximal Scor 70
Compilator c-64 Status done
Runda Arhiva educationala Marime 3.22 kb
#include <stdio.h>
#include <stdlib.h>
typedef struct type_element{
int key, val_subsir, poz;
} element;
typedef struct type_node{
    element *actual, *info_left;
struct type_node *left, *right;
} node;
int *anterior, k, maxk, *sir;
element *maxim, *nou;

element *add_node(node *root, element *next){
    //printf("%d   ", root->actual->key);
if(next->key==root->actual->key){
        //if(root->info_left)
    if(root->info_left && next->val_subsir < root->info_left->val_subsir){
        next->val_subsir=root->info_left->val_subsir;
       // next->val_subsir++;
        anterior[k]=root->info_left->poz;
    }
    next->val_subsir++;
    if(root->actual->val_subsir < next->val_subsir){

    free(root->actual);
    root->actual=next;
    if(next->val_subsir > maxim->val_subsir){
           // maxim2=maxim;
        maxim=next;
        maxk=k;
    }
    }
    return root->actual;
}
if(next->key > root->actual->key){
        if(root->info_left){
    if(root->actual->val_subsir > root->info_left->val_subsir){
        if(next->val_subsir<root->actual->val_subsir){
            next->val_subsir=root->actual->val_subsir;
             anterior[k]=root->actual->poz;
        }
    }
    else{
        if(next->val_subsir<root->info_left->val_subsir){
        next->val_subsir=root->info_left->val_subsir;
        anterior[k]=root->info_left->poz;
       }
    }
    }
    else{
        if(next->val_subsir < root->actual->val_subsir){
             next->val_subsir=root->actual->val_subsir;
             anterior[k]=root->actual->poz;
        }
    }
    if(root->right){
         add_node(root->right, next);
    }
    else{
        root->right=calloc(1, sizeof(node));
        (next->val_subsir)++;
        root->right->actual=next;
        if(next->val_subsir > maxim->val_subsir){
        //maxim2=maxim;
        maxim=next;
         maxk=k;
        }
    }
    return next;
}
if(root->left){
 add_node(root->left, next);
if(next->val_subsir > root->info_left->val_subsir){
    root->info_left=next;
}

}
else{
        root->left=calloc(1, sizeof(node));
        next->val_subsir++;
        root->left->actual=next;
        root->info_left=next;
        if(next->val_subsir > maxim->val_subsir){
        //maxim2=maxim;
        maxim=next;
         maxk=k;
        }

}
return next;
}

void afisare(FILE *pf, int a){
if(a){
    afisare(pf, anterior[a]);
    fprintf(pf, "%d ", sir[a]);
}
}
int main()
{
    FILE *pf=fopen("scmax.in", "r");
    int n, a=1;
    fscanf(pf, "%d", &n);
    sir=calloc(n+1, sizeof(int));
    anterior=calloc(n, sizeof(int));
    node* root=calloc(1, sizeof(node));
    nou=calloc(1, sizeof(element));
        nou->poz=1;
        fscanf(pf, "%d", &nou->key);
        sir[1]=nou->key;
        nou->val_subsir=1;
        root->actual=nou;
    maxim=nou;
    //maxim2=maxim;
    for(k=2; k<=n; k++){

        nou=calloc(1, sizeof(element));
        nou->poz=k;
        fscanf(pf, "%d", &nou->key);
         sir[k]=nou->key;
        add_node(root, nou);

    }
    //printf("%d", a);
    fclose(pf);
    pf=fopen("scmax.out", "w");
    fprintf(pf, "%d\n", maxim->val_subsir);
    afisare(pf, maxk);
    fclose(pf);
    return 0;
}