Cod sursa(job #2242896)

Utilizator eduardandrei20Nechifor Eduard Andrei eduardandrei20 Data 19 septembrie 2018 18:19:29
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;

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

int value, v[100001*5], n, op, start, finish, poz, maxim;

void update(int nod, int left, int right) {
    if (left == right){
        v[nod] = value;
        return;
    }
    int m = (left + right) /2;
    if (poz <= m) {
        update(nod * 2, left, m);
    }
    else update(nod * 2 + 1 , m + 1 , right);
    v[nod] = max(v[2 * nod], v[2 * nod + 1]);
}

void query(int nod, int left, int right) {
    if (start <= left && finish >= right) {
        maxim = max(maxim, v[nod]);
        return;
    }
    int m = (left + right) / 2;
    if (start <= m)
        query(nod * 2, left, m);
    if (finish > m)
        query(nod * 2 + 1, m + 1, right);
}


int main() {
    in >> n >> op;
    for (int i = 1; i <= n; i++) {
        poz = i;
        in >> value;
        update(1, 1, n);
    }
    for (int i =1; i <= op; i++) {
        int c;
        in >> c;
        if (c == 1) {
            in >> poz >> value;
            update(1, 1, n);
        }
        else {
            maxim = -1;
            in >> start >> finish;
            query(1, 1, n);
            out << maxim << "\n";
        }
    }
    return 0;
}