Cod sursa(job #1527736)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 18 noiembrie 2015 17:54:41
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
/**
    Let A be a sequence of N natural numbers. On it, M operations will be made of the following format:
    0 a b - Print the maximum number from interval [Aa, Ab]
    1 a b - Aa = b
**/

#include <cstdio>
#include <algorithm>
 
#define NMAX 400005
 
using namespace std;
 
int N, M, a, b;
int tree[NMAX], maximum;
 
void update(int vertex, int left, int right) {
    if (left == right) {
        tree[vertex] = b;
        return;
    }
 
    int mid = (left + right) / 2;
    if (a <= mid) {
        update(2 * vertex, left, mid);
    }
    else {
        update(2 * vertex + 1, mid + 1, right);
    }
    tree[vertex] = max(tree[2 * vertex], tree[2 * vertex + 1]);
}
 
void query(int vertex, int left, int right) {
    if (a <= left && right <= b) {
        maximum = max(maximum, tree[vertex]);
        return;
    }
 
    int mid = (left + right) / 2;
    if (a <= mid) {
        query(2 * vertex, left, mid);
    }
    if (b > mij) {
        query(2 * vertex + 1, mid + 1, right);
    }
}
 
void read() {
    scanf("%d %d", &N, &M);
    for (a = 1; a <= N; ++a) {
        scanf("%d", &b);
        update(1, 1, N);
    }
}
 
void solve() {
    int operationType;
 
    for (int i = 1; i <= M; ++i) {
        scanf("%d %d %d", &operationType, &a, &b);
        if (operationType == 0) {
            maximum = 0;
            query(1, 1, N);
            printf("%d\n", maximum);
        }
        else {
            update(1, 1, N);
        }
    }
}
 
int main() {
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
 
    read();
    solve();
}