Cod sursa(job #2634619)

Utilizator irimia_alexIrimia Alex irimia_alex Data 11 iulie 2020 18:22:26
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#include <map>
#define NMAX 100001

using namespace std;

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

int n,m;
int arb[2 * NMAX], v[NMAX];

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

void update(int index, int val,int i,int j,int k=1) {
    if (i == index && j == index) { arb[k] = val; return; }
    int m = (i + j) / 2;
    if (index <= m) {
        update(index, val, i, m, 2 * k);
    }
    else update(index, val, m + 1, j, 2 * k + 1);
    arb[k] = max(arb[2 * k], arb[2 * k + 1]);

}

int buildArb(int i,int j,int k=1) {
    if (i == j) { arb[k] = v[i]; return arb[k]; }
    int m = (i + j) / 2;
    int left = buildArb(i, m, 2 * k);
    int right = buildArb(m + 1, j, 2 * k + 1);
    arb[k] = max(left, right);
    return arb[k];
}

int getMax(int left, int right, int i, int j,int k=1) {
    if (i > right || j < left) return -1;
    if (i >= left && j <= right) return arb[k];
    int m = (i + j) / 2;
    int x = getMax(left, right, i, m, 2 * k);
    int y = getMax(left, right, m + 1, j, 2 * k + 1);
    return max(x, y);
}

int main()
{
    fin >> n >> m;
    for (int i = 1;i <= n;++i)
        fin >> v[i];
    buildArb(1, n);
    while (m--) {
        int t, x, y;
        fin >> t >> x >> y;
        if (t == 0)
            fout << getMax(x, y, 1, n) << '\n';
        else update(x, y, 1, n);
    }

    return 0;
}