Cod sursa(job #283254)

Utilizator victorsbVictor Rusu victorsb Data 18 martie 2009 22:06:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <cstdio>

using namespace std;

#define FIN "arbint.in"
#define FOUT "arbint.out"
#define MAX_N 100015
#define MAX_AI 262144

int N, M, Q;
int ai[MAX_AI];
int sir[MAX_N];

inline int max(int a, int b) {
    if (a > b)
        return a;
    else
        return b;
}

void read() {
    scanf("%d %d", &N, &M);
    for (int i = 1; i <= N; ++i)
        scanf("%d", &sir[i]);
}

void init(int nod, int st, int dr) {
    if (st == dr) {
        ai[nod] = sir[st];
    }
    else {
        int mij = (st + dr) / 2, fs = nod * 2, fd = nod * 2 + 1;
        init(fs, st, mij);
        init(fd, mij + 1, dr);
        ai[nod] = max(ai[fs], ai[fd]);
    }
}

void update(int nod, int st, int dr, int pos) {
    if (st == dr) {
        ai[nod] = sir[st];
    }
    else {
        int mij = (st + dr) / 2, fs = nod * 2, fd = nod * 2 + 1;
        if (pos <= mij)
            update(fs, st, mij, pos);
        else
            update(fd, mij + 1, dr, pos);
        ai[nod] = max(ai[fs], ai[fd]);
    }
}

void query(int nod, int st, int dr, int a, int b) {
    if (a <= st && dr <= b) {
        Q = max(Q, ai[nod]);
    }
    else {
        int mij = (st + dr) / 2, fs = nod * 2, fd = nod * 2 + 1;
        if (a <= mij)
            query(fs, st, mij, a, b);
        if (mij < b)
            query(fd, mij + 1, dr, a, b);
    }
}

void solve() {
    init(1, 1, N);
    for (; M; --M) {
        int tip, a, b;
        scanf("%d %d %d\n", &tip, &a, &b);
        if (tip) {
            sir[a] = b;
            update(1, 1, N, a);
        }
        else {
            Q = 0;
            query(1, 1, N, a, b);
            printf("%d\n", Q);
        }
    }
}

int main() {
    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);
    read();
    solve();
    return 0;
}