Cod sursa(job #1960831)

Utilizator AhileGigel Frone Ahile Data 10 aprilie 2017 18:26:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<bits/stdc++.h>

using namespace std;

int const MAXSIZE = 40000010;

int arb[MAXSIZE];
int n, m, code, a, b, x, k;

int interval(int a, int b, int node, int l, int r) {
    //out << node << " ";
    if (a <= l && b >= r)
        k = max(k, arb[node]);
    else {
        int mid = (l + r) / 2;
        if (a <= mid)
            interval(a, b, node * 2, l, mid);
        if (b > mid)
            interval(a, b, node * 2 + 1, mid + 1, r);
    }
}

int change(int a, int val, int node, int l, int r) {
    if (l == r) {
        arb[node] = val;
    } else {
        int mid = (l + r) / 2;
        if (a <= mid)
            change(a, val, node * 2, l, mid);
        if (a > mid)
            change(a, val, node * 2 + 1, mid + 1, r);
        arb[node] = max (arb[2 * node], arb[2 * node + 1]);
    }
}

int main() {
    freopen("arbint.in" ,"r",stdin);
    freopen("arbint.out" ,"w",stdout);
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &x);
        change(i, x, 1, 1, n);
    }
    for (int i = 1; i <= m; i++) {
        scanf("%d %d %d", &code, &a, &b);
        if (code == 0) {
            k = 0;
            interval(a, b, 1, 1, n);
             printf("%d \n", k);
        } else {
            change(a, b, 1, 1, n);
        }
    }
}