Cod sursa(job #2680059)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 2 decembrie 2020 14:42:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <stdio.h>
#include <vector>
#include <limits.h>

using namespace std;

class SegmentTree {
private:
    int no_numbers;
    vector<int> segTree;

public:
    SegmentTree(vector<int> numbers);
    void update(int index, int value);
    int maximum(int left, int right);
};

SegmentTree::SegmentTree(vector<int> numbers) {
    this->no_numbers = numbers.size();
    this->segTree.resize(2 * this->no_numbers);
    for (int i = 0; i < this->no_numbers; i++) {
        this->segTree[i + this->no_numbers] = numbers[i];
    }
    for (int i = this->no_numbers - 1; i > 0; i--) {
        this->segTree[i] = max(this->segTree[i * 2], this->segTree[i * 2 + 1]);
    }
}

void SegmentTree::update(int index, int value) {
    int node = index + this->no_numbers;
    this->segTree[node] = value;
    while (node > 1) {
        node /= 2;
        this->segTree[node] = max(this->segTree[node * 2], this->segTree[node * 2 + 1]);
    }
}

int SegmentTree::maximum(int left, int right) {
    int ans = INT_MIN;
    int nodeleft = left + this->no_numbers;
    int noderight = right + this->no_numbers;
    while (nodeleft <= noderight) {
        if (nodeleft % 2 == 1) {
            ans = max(this->segTree[nodeleft], ans);
            nodeleft++;
        }
        if (noderight % 2 == 0) {
            ans = max(this->segTree[noderight], ans);
            noderight--;
        }
        nodeleft /= 2;
        noderight /= 2;
    }
    return ans;
}

int main() {
    FILE * fin = fopen("arbint.in", "r");
    FILE * fout = fopen("arbint.out", "w");
    int n, m, option, a, b;

    fscanf(fin, "%d%d", &n, &m);

    vector<int> numbers(n);
    for (int i = 0; i < n; i++) {
        fscanf(fin, "%d", &numbers[i]);
    }
    SegmentTree segmentTree(numbers);

    for (int i = 0; i < m; i++) {
        fscanf(fin, "%d%d%d", &option, &a, &b);
        if (option == 1) {
            segmentTree.update(a - 1, b);
        } else {
            fprintf(fout, "%d\n", segmentTree.maximum(a - 1, b - 1));
        }
    }

    fclose(fin);
    fclose(fout);

    return 0;
}