Cod sursa(job #2604888)

Utilizator matthriscuMatt . matthriscu Data 23 aprilie 2020 19:42:04
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
#define max(a, b) ((a > b) ? a : b)
int n, m, c, x, y, i, v[100000], arbint[262144], maxim;

void update(int x, int y, int st, int dr, int pos) {
    if(st == dr)
        arbint[pos] = y;
    else {
        int m = (st+dr) >> 1;
        if(x <= m)
            update(x, y, st, m, pos << 1);
        else
            update(x, y, m+1, dr,(pos << 1) + 1);
        arbint[pos] = max(arbint[pos << 1], arbint[(pos << 1) + 1]);
    }
}

void query(int x, int y, int st, int dr, int pos) {
    if(x <= st && dr <= y)
        maxim = max(maxim, arbint[pos]);
    else {
        int m = (st + dr) >> 1;
        if(x <= m)
            query(x, y, st, m, pos << 1);
        else
            query(x, y, m+1, dr, (pos << 1) + 1);
    }
}

int main() {
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d", &n, &m);

    for(i = 1; i <= n; ++i) {
        scanf("%d", &y);
        update(i, y, 1, n, 1);
    }
    for(i = 1; i <= m; ++i) {
        scanf("%d%d%d", &c, &x, &y);
        if(c == 0) {
            maxim = -1;
            query(x, y, 1, n, 1);
            printf("%d\n", maxim);
        }
        else
            update(x, y, 1, n, 1);
    }
}