Cod sursa(job #2763909)

Utilizator vlad2009Vlad Tutunaru vlad2009 Data 17 iulie 2021 18:52:12
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>

using namespace std;

const int Nmax = 1000000;
int a[Nmax + 1], aint[4 * Nmax + 1];

void build(int node, int l, int r)
{
    if (l == r)
    {
        aint[node] = a[l];
    }
    else
    {
        int mid = (l + r) / 2;
        build(2 * node, l, mid);
        build(2 * node + 1, mid + 1, r);
        aint[node] = max(aint[2 * node], aint[2 * node + 1]);
    }
}

int query(int node, int l, int r, int p, int q)
{
    if (p > q)
    {
        return 0;
    }
    else if (p == l && q == r)
    {
        return aint[node];
    }
    int mid = (l + r) / 2;
    return max(query(2 * node, l, mid, p, min(q, mid)), query(2 * node + 1, mid + 1, r, max(p, mid + 1), q));
}

void update(int node, int l, int r, int poz, int k)
{
    if (l == r)
    {
        aint[node] = k;
    }
    else
    {
        int mid = (l + r) / 2;
        if (poz <= mid)
        {
            update(2 * node, l, mid, poz, k);
        }
        else
        {
            update(2 * node + 1, mid + 1, r, poz, k);
        }
        aint[node] = max(aint[2 * node], aint[2 * node + 1]);
    }
}

int main()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    int n, m;
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        fin >> a[i];
    }
    build(1, 1, n);
    while (m--)
    {
        int t, l, r;
        fin >> t >> l >> r;
        if (t == 0)
        {
            fout << query(1, 1, n, l, r) << "\n";
        }
        else
        {
            update(1, 1, n, l, r);
        }
    }
    return 0;
}