Cod sursa(job #2752126)

Utilizator MaxamPJORares Daniel MaxamPJO Data 16 mai 2021 19:45:28
Problema Subsir crescator maximal Scor 30
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.83 kb
#include <stdio.h>
#include <stdlib.h>
typedef struct type_element{
int key, val_subsir;
} element;
typedef struct type_node{
    element *actual, *info_left;
struct type_node *left, *right;
} node;
int *anterior, k;
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->key;
    }

    if(root->actual->val_subsir < next->val_subsir){
    free(root->actual);
    root->actual=next;
    if(next->val_subsir > maxim->val_subsir){
        maxim=next;
    }
    }
    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->key;
        }
    }
    else{
        if(next->val_subsir<root->info_left->val_subsir){
        next->val_subsir=root->info_left->val_subsir;
        anterior[k]=root->info_left->key;
       }
    }
    }
    else{
        if(next->val_subsir < root->actual->val_subsir){
             next->val_subsir=root->actual->val_subsir;
             anterior[k]=root->actual->key;
        }
    }
    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){
        maxim=next;
        }
    }
    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){
        maxim=next;
        }

}
return next;
}


int main()
{
    FILE *pf=fopen("scmax.in", "r");
    int n;
    fscanf(pf, "%d", &n);
    anterior=calloc(n, sizeof(int));
    node* root=calloc(1, sizeof(node));
    nou=calloc(1, sizeof(element));
        fscanf(pf, "%d", &nou->key);
        nou->val_subsir=1;
        root->actual=nou;
    maxim=nou;
    for(k=0; k<n-1; k++){
        nou=calloc(1, sizeof(element));
        fscanf(pf, "%d", &nou->key);
       // printf("%d\n", nou->key);
        add_node(root, nou);
        //printf("%d %d\n", maxim->key, maxim->val_subsir);
    }
    fclose(pf);
    pf=fopen("scmax.out", "w");
    fprintf(pf, "%d", maxim->val_subsir);
    fclose(pf);
    return 0;
}