Cod sursa(job #1960825)

Utilizator AhileGigel Frone Ahile Data 10 aprilie 2017 18:23:14
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<bits/stdc++.h>
#define in f
#define out g
using namespace std;

ifstream f ("arbint.in");
ofstream g ("arbint.out");

int const MAXSIZE = 40000010;

int arb[MAXSIZE];
int n, m, code, a, b, x, k;

int interval(int a, int b, int node, int l, int r) {
    //out << node << " ";
    if (a <= l && b >= r)
        k = max(k, arb[node]);
    else {
        int mid = (l + r) / 2;
        if (a <= mid)
            interval(a, b, node * 2, l, mid);
        if (b > mid)
            interval(a, b, node * 2 + 1, mid + 1, r);
    }
}

int change(int a, int val, int node, int l, int r) {
    if (l == r) {
        arb[node] = val;
    } else {
        int mid = (l + r) / 2;
        if (a <= mid)
            change(a, val, node * 2, l, mid);
        if (a > mid)
            change(a, val, node * 2 + 1, mid + 1, r);
        arb[node] = max (arb[2 * node], arb[2 * node + 1]);
    }
}

int main() {
    in >> n >> m;
    for (int i = 1; i <= n; i++) {
        in >> x;
        change(i, x, 1, 1, n);
    }
    for (int i = 1; i <= m; i++) {
        in >> code >> a >> b;
        if (code == 0) {
            k = 0;
            interval(a, b, 1, 1, n);
            out << k << endl;
        } else {
            change(a, b, 1, 1, n);
        }
    }
    return 0;
}