Cod sursa(job #3221693)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 7 aprilie 2024 20:12:57
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, Q;
int a[100005], tree[400005];

void Build(int node, int st, int dr)
{
    if (st == dr)
        tree[node] = a[st];
    else
    {
        int mij = (st + dr) / 2;
        Build(2 * node, st, mij);
        Build(2 * node + 1, mij + 1, dr);

        tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }
}
void Update(int node, int st, int dr, int poz, int val)
{
    if (st == dr)
        tree[node] = val;
    else
    {
        int mij = (st + dr) / 2;
        if (poz <= mij)
            Update(2 * node, st, mij, poz, val);
        else
            Update(2 * node + 1, mij + 1, dr, poz, val);

        tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }
}
int Query(int node, int st, int dr, int x, int y)
{
    if (x <= st && dr <= y)
        return tree[node];
    int mij, r1, r2;
    r1 = r2 = -2e9;
    mij = (st + dr) / 2;

    if (x <= mij)
        r1 = Query(2 * node, st, mij, x, y);
    if (y > mij)
        r2 = Query(2 * node + 1, mij + 1, dr, x, y);
    return max(r1, r2);
}

int main()
{
    int i, op, x, y ;
    fin >> n >> Q;
    for (i = 1; i <= n; i++)
        fin >> a[i];
    Build(1, 1, n);
    while (Q--)
    {
        fin >> op >> x >> y;
        if (op == 0)
            fout << Query(1, 1, n, x, y) << "\n";
        else
            Update(1, 1, n, x, y);
    }
    return 0;
}