Cod sursa(job #1969905)

Utilizator tudormaximTudor Maxim tudormaxim Data 18 aprilie 2017 18:38:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int maxn = 1e5 + 5;
int T[maxn << 1];
int n, q;

void Build() {
    for (int i = n - 1; i >= 0; i--) {
        T[i] = max(T[i << 1], T[i << 1 | 1]);
    }
}

void Update(int pos, int val) {
    pos += n - 1;
    T[pos] = val;
    while (pos > 1) {
        int i = pos >> 1;
        T[i] = max(T[pos], T[pos ^ 1]);
        pos = i;
    }
}

int Query(int l, int r) {
    int ans = 0;
    l += n - 1;
    r += n;
    while (l < r) {
        if (l & 1) ans = max(ans, T[l++]);
        if (r & 1) ans = max(ans, T[--r]);
        l >>= 1;
        r >>= 1;
    }
    return ans;
}

int main() {
    ios_base :: sync_with_stdio(false);
    fin >> n >> q;
    for (int i = 1; i <= n; i++) {
        fin >> T[i + n - 1];
    }
    Build();
    while (q--) {
        int op, x, y;
        fin >> op >> x >> y;
        if (op == 1) Update(x, y);
        if (op == 0) fout << Query(x, y) << "\n";
    }
    return 0;
}