Cod sursa(job #595594)

Utilizator SpiderManSimoiu Robert SpiderMan Data 13 iunie 2011 12:06:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
# include <cstring>
# include <cstdio>

const char *FIN = "arbint.in", *FOU = "arbint.out";

int ai[400105];
int N, M;

inline int max (int a, int b) {
    return (a > b ? a : b);
}

void update (int nod, int st, int dr, int poz, int val) {
    if (st == dr) {
        ai[nod] = val;
        return ;
    }
    int mij = st + dr >> 1;
    if (poz <= mij)
        update (nod << 1, st, mij, poz, val);
    else
        update ((nod << 1) + 1, mij + 1, dr, poz, val);
    ai[nod] = max (ai[nod << 1], ai[(nod << 1) + 1]);
}

int query (int nod, int st, int dr, int s1, int s2) {
    if (s1 <= st && dr <= s2) {
        return max (0, ai[nod]);
    }
    int mij = st + dr >> 1;
    return max (s1 <= mij ? query (nod << 1, st, mij, s1, s2) : 0, mij < s2 ? query ((nod << 1) + 1, mij + 1, dr, s1, s2) : 0);
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    scanf ("%d %d", &N, &M);
    for (int i = 1, x; i <= N; ++i) {
        scanf ("%d", &x);
        update (1, 1, N, i, x);
    }
    for (int i = 1, tip, x, y; i <= M; ++i) {
        scanf ("%d %d %d", &tip, &x, &y);
        if (tip) {
            update (1, 1, N, x, y);
        } else {
            printf ("%d\n", query (1, 1, N, x, y));
        }
    }
}