Cod sursa(job #2497821)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 23 noiembrie 2019 11:26:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int MAXN = 100001;
int tree[4 * MAXN], n, t;

void update(int pos, int value, int ind, int left, int right) {
    if (left == right) {
        tree[ind] = value;
        return;
    }
    int middle = left + (right - left) / 2;
    if (pos <= middle)
        update(pos, value, 2 * ind, left, middle);
    else
        update(pos, value, 2 * ind + 1, middle + 1, right);
    tree[ind] = max(tree[2 * ind], tree[2 * ind + 1]);
}

int getMax(int x, int y, int ind, int left, int right) {
    if (left >= x && right <= y)
        return tree[ind];
    int middle = left + (right - left) / 2;
    if (y <= middle)
        return getMax(x, y, 2 * ind, left, middle);
    if (x > middle)
        return getMax(x, y, 2 * ind + 1, middle + 1, right);
    return max(getMax(x, y, 2 * ind, left, middle), getMax(x, y, 2 * ind + 1, middle + 1, right));
}

int main() {
    fin >> n >> t;
    for (int i = 1; i <= n; ++i) {
        int x;
        fin >> x;
        update(i, x, 1, 1, n);
    }
    for (int i = 1; i <= t; ++i) {
        int type, x, y;
        fin >> type >> x >> y;
        if (type == 0)
            fout << getMax(x, y, 1, 1, n) << '\n';
        else
            update(x, y, 1, 1, n);
    }
    return 0;
}