Cod sursa(job #3179221)

Utilizator razviOKPopan Razvan Calin razviOK Data 3 decembrie 2023 13:05:56
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct Node{

    int key;
    int dimension;
    struct Node *left;
    struct Node *right;
};
int GetDimension(Node *node){
    if(NULL==node)
        return 0;
    return node->dimension;
}
void InsertInTree(Node **root,int key){

    if(NULL==(*root)){
        (*root)=(Node *) malloc(sizeof(Node));
        (*root)->key=key;
        (*root)->dimension=1;
        (*root)->left=NULL;
        (*root)->right=NULL;
        return;
    }
    Node *curr_node=(*root);
    bool ok=false;
    while(!ok){
        if(key>curr_node->key){
            curr_node->dimension+=1;
            if(NULL==curr_node->right){
                Node *temp=(Node *) malloc(sizeof(Node));
                temp->key=key;
                temp->dimension=1;
                temp->right=NULL;
                temp->left=NULL;
                curr_node->right=temp;
                ok=true;
            }
            else curr_node=curr_node->right;
        }
        else if(key<curr_node->key){
            curr_node->dimension+=1;
            if(NULL==curr_node->left){
                Node *temp=(Node *) malloc(sizeof(Node));
                temp->key=key;
                temp->dimension=1;
                temp->right=NULL;
                temp->left=NULL;
                curr_node->left=temp;
                ok=true;
            }
            else curr_node=curr_node->left;
        }
    }

}
void OS_SELECT(Node **root,int index){

    Node *curr_node=(*root);
    int rank= GetDimension(curr_node->left)+1;
    while(rank!=index && curr_node!=NULL){
        if(rank>index) curr_node=curr_node->left;
        else {
            curr_node=curr_node->right;
            index=index-rank;
        }
        rank= GetDimension(curr_node->left)+1;
    }

    printf("%d",curr_node->key);

}
int main() {

    freopen("sdo.in","r",stdin);
    freopen("sdo.out","w",stdout);
    Node *root=NULL;
    int N,x,k;
    scanf("%d",&N);
    scanf("%d",&k);
    for(int i=0;i<N;i++) {
        scanf("%d", &x);
        InsertInTree(&root,x);
    }

    OS_SELECT(&root,k);

     return 0;
}