Cod sursa(job #2301213)

Utilizator mihaicivMihai Vlad mihaiciv Data 12 decembrie 2018 19:08:35
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <stdio.h>
#include <stdlib.h>

FILE *f, *g;

int getMaxValue(int x, int y) {
    return ( (x > y)? x:y );
}

void createSegmentTree(int node, int left, int right, int *arr, int *sgmTree) {

    if (left == right) {
        fscanf(f, "%d", &arr[left]);
        sgmTree[node] = arr[left];
    } else {

        int mid = (left + right) / 2;
        createSegmentTree(2 * node, left, mid, arr, sgmTree);
        createSegmentTree(2 * node + 1, mid + 1, right, arr, sgmTree);

        sgmTree[node] = getMaxValue(sgmTree[2 * node], sgmTree[2 * node + 1]);

    }

}

int getMaximum(int node, int left, int right, int leftSegment, int rightSegment, int* sgmTree) {

    if (leftSegment <= left && right <= rightSegment) {
        return sgmTree[node];
    } else {
        int leftMaximum = 0;
        int rightMaximum = 0;
        int mid = (left + right) / 2;
        if (mid >= leftSegment) {
            leftMaximum = getMaximum(2 * node, left, mid, leftSegment, rightSegment, sgmTree);
        }
        if (mid + 1 <= rightSegment) {
            rightMaximum = getMaximum(2 * node + 1, mid + 1, right, leftSegment, rightSegment, sgmTree);
        }

        return getMaxValue(leftMaximum, rightMaximum);

    }

}

void setValue(int node, int left, int right, int pos, int value, int* arr, int *sgmTree) {
    if (left == right) {
        arr[left] = value;
        sgmTree[node] = value;
    } else {
        int mid = (left + right) / 2;
        if (pos <= mid) {
            setValue(2 * node, left, mid, pos, value, arr, sgmTree);
        } else {
            setValue(2 * node + 1, mid + 1, right, pos, value, arr, sgmTree);
        }

        sgmTree[node] = getMaxValue(sgmTree[2 * node], sgmTree[2 * node + 1]);

    }
}

int main() {

    f = fopen("arbint.in", "r");
    g = fopen("arbint.out", "w");

    int n, m;
    fscanf(f, "%d %d", &n, &m);

    int *arr = (int*) malloc(n * sizeof(int));
    int *sgmTree = (int*) malloc(4 * n * sizeof(int));

    createSegmentTree(1, 0, n - 1, arr, sgmTree);

    int i;
    for (i = 0; i < m; ++i) {
        int type, a, b;
        fscanf(f, "%d %d %d", &type, &a, &b);
        if (type == 0) {
            a --;
            b --;
            fprintf(g, "%d\n", getMaximum(1, 0, n - 1, a, b, sgmTree));

        } else {
            a --;
            setValue(1, 0, n - 1, a, b, arr, sgmTree);
        }
    }


    return 0;
}