Cod sursa(job #3232773)

Utilizator Mihai_ToderascToderasc Mihai Mihai_Toderasc Data 1 iunie 2024 12:37:38
Problema Arbori de intervale Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 3.28 kb
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100000
#define FILE_IN "arbint.in"
#define FILE_OUT "arbint.out"

int n, m, numbers[MAX_SIZE + 1];

typedef struct node_t {
    int value;
    struct node_t *leftChild, *rightChild;
} Node;

int max(int a, int b) {
    return a > b ? a : b;
}

Node* makeTree(Node *currNode, int left, int right, int arrIndex, int val) {
    if(!currNode) {
        currNode = malloc(sizeof(Node));
        currNode->leftChild = NULL;
        currNode->rightChild = NULL;
    }

    if(left == right) {
        currNode->value = val;
        return currNode;
    }

    int mid = (left + right) / 2;
    if(arrIndex <= mid) {
        currNode->leftChild = makeTree(currNode->leftChild, left, mid, arrIndex, val);
    }
    else {
        currNode->rightChild = makeTree(currNode->rightChild, mid + 1, right, arrIndex, val);
    }

    if(currNode->leftChild && currNode->rightChild) {
        currNode->value = max(currNode->leftChild->value, currNode->rightChild->value);
    }
    else if(!currNode->rightChild) {
        currNode->value = currNode->leftChild->value;
    }
    else if(!currNode->leftChild) {
        currNode->value = currNode->rightChild->value;
    }

    return currNode;
}

int searchTree(Node *currNode, int left, int right, int arrIndex1, int arrIndex2) {
    if((left == arrIndex1 && right == arrIndex2) || left == right) {
        return currNode->value;
    }

    int mid = (left + right) / 2;
    int arrMid = (arrIndex1 + arrIndex2) / 2;
    if(arrMid <= mid) {
        return searchTree(currNode->leftChild, left, mid, arrIndex1, arrIndex2);
    }
    else {
        return searchTree(currNode->rightChild, mid + 1, right, arrIndex1, arrIndex2);
    }
    /*
    if(arrIndex1 <= mid && arrIndex2 > mid) {
        return max(searchTree(currNode->leftChild, left, mid, arrIndex1, arrIndex2),
                   searchTree(currNode->rightChild, mid + 1, right, arrIndex1, arrIndex2));
    }
    else if(arrIndex2 <= mid) {
        return searchTree(currNode->leftChild, left, mid, arrIndex1, arrIndex2);
    }
    else if(arrIndex1 > mid) {
        return searchTree(currNode->rightChild, mid + 1, right, arrIndex1, arrIndex2);
    }
    */
}

void printTree(Node *currNode) {
    if(!currNode) {
        return;
    }

    printTree(currNode->leftChild);
    printTree(currNode->rightChild);
    printf("%d ", currNode->value);
}

int main()
{
    FILE *fileIn = fopen(FILE_IN, "r"),
         *fileOut = fopen(FILE_OUT, "w");

    Node *tree = NULL;

    fscanf(fileIn, "%d%d", &n, &m);
    for(int i = 1; i <= n; i++) {
        fscanf(fileIn, "%d", &numbers[i]);
        tree = makeTree(tree, 1, n, i, numbers[i]);
    }
    /*
    printTree(tree);
    printf("\n-----\n");
    */
    int comms[3];
    for(int i = 0; i < m; i++) {
        fscanf(fileIn, "%d%d%d", &comms[0], &comms[1], &comms[2]);

        if(comms[0] == 0) {
            fprintf(fileOut, "%d\n", searchTree(tree, 1, n, comms[1], comms[2]));
        }
        else if(comms[0] == 1) {
            tree = makeTree(tree, 1, n, comms[1], comms[2]);
        }
        /*
        printTree(tree);
        printf("\n-----\n");
        */
    }

    fclose(fileIn);
    fclose(fileOut);
    return 0;
}