Cod sursa(job #2301225)

Utilizator mihaicivMihai Vlad mihaiciv Data 12 decembrie 2018 19:21:16
Problema Datorii Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <stdio.h>
#include <stdlib.h>

FILE *f, *g;

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] = sgmTree[2 * node] + sgmTree[2 * node + 1];

    }

}

int getSum(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 = getSum(2 * node, left, mid, leftSegment, rightSegment, sgmTree);
        }
        if (mid + 1 <= rightSegment) {
            rightMaximum = getSum(2 * node + 1, mid + 1, right, leftSegment, rightSegment, sgmTree);
        }

        return (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] = sgmTree[2 * node] + sgmTree[2 * node + 1];

    }
}

int main() {

    f = fopen("datorii.in", "r");
    g = fopen("datorii.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 == 1) {
            a --;
            b --;
            fprintf(g, "%d\n", getSum(1, 0, n - 1, a, b, sgmTree));

        } else {
            a --;
            int diff = arr[a] - b;
            setValue(1, 0, n - 1, a, diff, arr, sgmTree);
        }
    }


    return 0;
}