Cod sursa(job #1976898)

Utilizator blatulInstitutul de Arta Gastronomica blatul Data 4 mai 2017 15:24:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 100001

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int Arbint[4 * NMAX], v[NMAX];

inline int L(const int node) {

    return (node << 1);
}

inline int R(const int node) {

    return (node << 1) + 1;
}

void buildArb(int node, int st, int dr) {

    if (st == dr) {
        Arbint[node] = v[st];
        return;
    }

    int mid = (st + dr) >> 1;

    buildArb(L(node), st, mid);
    buildArb(R(node), mid + 1, dr);

    Arbint[node] = max(Arbint[L(node)], Arbint[R(node)]);
}

void update(int node, int st, int dr, int poz, int val) {

    if (st == dr) {
        Arbint[node] = val;
        return;
    }

    int mid = (st + dr) >> 1;

    if (poz <= mid)
        update(L(node), st, mid, poz, val);
    else
        update(R(node), mid + 1, dr, poz, val);

    Arbint[node] = max(Arbint[L(node)], Arbint[R(node)]);
}

int query(int node, int st, int dr, int a, int b) {

    if (a <= st && dr <= b) {
        return Arbint[node];
    }

    int mid = (st + dr) >> 1;

    int t1 = 0, t2 = 0;

    if (a <= mid)
        t1 = query(L(node), st, mid, a, b);

    if (b > mid)
        t2 = query(R(node), mid + 1, dr, a, b);

    return max(t1, t2);
}

int main() {

    int N, Q;

    fin >> N >> Q;

    for (int i = 1; i <= N; ++i)
        fin >> v[i];

    buildArb(1, 1, N);

    int t, x, y;
    while (Q--) {

        fin >> t >> x >> y;

        if (t == 0) {
            fout << query(1, 1, N, x, y) << "\n";
        }
        else {
            update(1, 1, N, x, y);
        }
    }

    return 0;
}