Cod sursa(job #2607340)

Utilizator matthriscuMatt . matthriscu Data 29 aprilie 2020 17:08:12
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#define max(a, b) ((a > b) ? a : b)

int n, m, i, c, x, y, v[262150], max;

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

void query(int x, int y, int st, int dr, int pos) {
    if(st == dr)
        max = max(v[pos], max);
    else {
        int m = (st + dr) / 2;
        if(x <= m)
            query(x, y, st, m, 2*pos);
        if(y > m)
            query(x, y, m+1, dr, 2*pos+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", &x);
        update(i, x, 1, n, 1);
    }
    for(i = 1; i <= m; ++i) {
        scanf("%d%d%d", &c, &x, &y);
        if(c == 0) {
            max = -1;
            query(x, y, 1, n, 1);
            printf("%d\n", max);
        }
        else
            update(x, y, 1, n, 1);
    }
}