Cod sursa(job #2576459)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 6 martie 2020 19:36:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAXN = 100005;

int tree[4 * MAXN], inp[MAXN], n, m;

void create(int left, int right, int ind)
{
    if (left == right) {
        tree[ind] = inp[left];
        return;
    }
    int mid = left + (right - left) / 2;
    create(left, mid, 2 * ind);
    create(mid + 1, right, 2 * ind + 1);
    tree[ind] = max(tree[2 * ind], tree[2 * ind + 1]);
}

void update(int left, int right, int ind, int val, int pos)
{
    if (left == right) {
        tree[ind] = val;
        return;
    }
    int mid = left + (right - left) / 2;
    if (pos <= mid)
        update(left, mid, 2 * ind, val, pos);
    else
        update(mid + 1, right, 2 * ind + 1, val, pos);
    tree[ind] = max(tree[2 * ind], tree[2 * ind + 1]);
}

int query(int left, int right, int ind, int x, int y)
{
    if (left >= x && right <= y)
        return tree[ind];
    int mid = left + (right - left) / 2, lSon = 0, rSon = 0;
    if (x <= mid)
        lSon = query(left, mid, 2 * ind, x, y);
    if (y > mid)
        rSon = query(mid + 1, right, 2 * ind + 1, x, y);
    return max(lSon, rSon);
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        fin >> inp[i];
    create(1, n, 1);
    for (int i = 0; i < m; ++i) {
        int type, x, y;
        fin >> type >> x >> y;
        if (type == 0)
            fout << query(1, n, 1, x, y) << '\n';
        else
            update(1, n, 1, y, x);
    }
    return 0;
}