Cod sursa(job #1834202)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 24 decembrie 2016 02:07:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 1e5 + 5;

int n, m;

int aint[NMAX * 2];

int query(int a, int b) {
    int ant = -1;

    a+= n - 1;
    b+= n;

    for (; a < b; a/= 2, b/= 2) {
        if (a % 2) ant = max(ant, aint[a++]);
        if (b % 2) ant = max(ant, aint[--b]); }

    return ant; }

void update(int pos, int val) {
    pos+= n - 1;
    aint[pos] = val;
    for (pos/= 2; pos > 0; pos/= 2)
        aint[pos] = max(aint[2 * pos], aint[2 * pos + 1]); }

int main(void) {
    ifstream fi("arbint.in");
    ofstream fo("arbint.out");
    int op, a, b;

    fi >> n >> m;
    for (int i = 1; i <= n; ++i)
        fi >> aint[i + n - 1];

    for (int i = n - 1; i >= 1; --i)
        aint[i] = max(aint[2 * i], aint[2 * i + 1]);

    while (m--) {
        fi >> op >> a >> b;
        switch (op) {
        case 0: {
            fo << query(a, b) << '\n';
            break; }
        case 1: {
            update(a, b);
            break; } } }

    return 0; }