Cod sursa(job #646165)

Utilizator padreatiAurelian Tutuianu padreati Data 10 decembrie 2011 23:51:54
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <cstdlib>
#include <cstdio>
#include <string>
#include <math.h>
#include <memory>

using namespace std;

int fill(int* v, int* t, int pos, int a, int b) {
    if (a == b) {
        t[pos] = v[a];
        return t[pos];
    }
    int mid = (a + b) / 2;
    t[pos] = max(fill(v, t, pos * 2, a, mid), fill(v, t, pos * 2 + 1, mid + 1, b));
    return t[pos];
}

int query(int*t, int pos, int a, int b, int x, int y) {
    if (x <= a && b <= y)
        return t[pos];
    int mid = (a + b) / 2;
    int m = 0;
    if (x <= mid) {
        m = max(m, query(t, pos * 2, a, mid, x, y));
    }
    if (mid + 1 <= y) {
        m = max(m, query(t, pos * 2 + 1, mid + 1, b, x, y));
    }
    return m;
}

int update(int*t, int pos, int a, int b, int x, int val) {
    if (a == b && a == x) {
        t[pos] = val;
        return val;
    }
    int mid = (a + b) / 2;
    int left = 0;
    int right = 0;
    if (x <= mid) {
        left = update(t, pos * 2, a, mid, x, val);
        right = t[pos * 2 + 1];
    } else {
        left = t[pos * 2];
        right = update(t, pos * 2 + 1, mid + 1, b, x, val);
    }
    t[pos] = max(left, right);
    return t[pos];
}

void sol() {
    int n, m;
    scanf("%d %d", &n, &m);

    int* v = new int[n+1];
    for (int i = 1; i <= n; i++) {
        scanf("%d", &v[i]);
    }

    int h = 1;
    while (h < n) {
        h *= 2;
    }
    int* t = new int[2* h];
    fill(v, t, 1, 1, n);
//    for (int i = 1; i <= 2*h; i++) {
//        printf("%d ", t[i]);
//    }

    for (int i = 0; i < m; i++) {
        int op, a, b;
        scanf("%d %d %d", &op, &a, &b);
        if (op == 0) {
            printf("%d\n", query(t, 1, 1, n, a, b));
        } else {
            update(t, 1, 1, n, a, b);
        }
    }




}

int main() {
#ifdef PADREATI
    freopen("in.txt", "r", stdin);
#else
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
#endif
    sol();
    return 0;
}