Cod sursa(job #2600473)

Utilizator RG1999one shot RG1999 Data 12 aprilie 2020 17:32:18
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>
#define MAX 500000

using namespace std;

void update(int* T, int value, int node, int left, int right, int pos) {
    if(left == right) {
        T[node] = value;
        return;
    } else {
        int mid = (left + right) / 2;
        if(pos <= mid) {
            update(T, value, 2 * node, left, mid, pos);
        } else {
            update(T, value, 2 * node + 1, mid + 1, right, pos);
        }

    }
    T[node] = max(T[node * 2], T[node * 2 + 1]);
}

void query(int *T, int node, int left, int right, int a, int b, int &maxim) {
    if(a <= left && b >= right) {
        if(T[node] > maxim) {
            maxim = T[node];
        }
        return;
    }
    int mid = (left + right) / 2;
    if(a <= mid) {
        query(T, 2 * node, left, mid, a, b, maxim);
    }
    if(b > mid) {
        query(T, 2 * node + 1, mid + 1, right, a, b, maxim);
    }


}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int n, m, x, a, b, maxim, cmd;
    scanf("%d %d", &n, &m);
    int T[MAX];
    for(int i = 1; i <= n; i++) {
        scanf("%d", &x);
        update(T, x, 1, 1, n, i);
    }
    for(int i = 0; i < n; i++) {
        scanf("%d %d %d", &cmd, &a ,&b);
        if(cmd == 1) {
            update(T, b, 1, 1, n, a);
        } else {
            maxim = -1;
            query(T, 1, 1, n, a, b, maxim);
            printf("%d\n", maxim);
        }
    }
    return 0;
}