Cod sursa(job #2477980)

Utilizator XXMihaiXX969Gherghinescu Mihai Andrei XXMihaiXX969 Data 21 octombrie 2019 13:55:14
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");
const int DIM = 1e5 + 7;

int v[DIM];
int arb[4 * DIM];

void build(int pos, int l, int r)
{
    if(l == r)
    {
        arb[pos] = v[l];
        return ;
    }

    int mid = (l + r) / 2;

    build(pos * 2, l, mid);
    build(pos * 2 + 1, mid + 1, r);

    arb[pos] = max(arb[pos * 2], arb[pos * 2 + 1]);
}

void update(int pos, int l, int r, int x, int val)
{
    if(l == r)
    {
        arb[pos] = val;
        return ;
    }

    int mid = (l + r) / 2;

    if(x <= mid)
        update(pos * 2, l, mid, x, val);
    else
        update(pos * 2 + 1, mid + 1, r, x, val);

    arb[pos] = max(arb[pos * 2], arb[pos * 2 + 1]);

}

int query(int pos, int l, int r, int st, int dr)
{
    if(st <= l && r <= dr)
    {
        return arb[pos];
    }

    int rez = 0;
    int mid = (l + r) / 2;

    if(st <= mid )
       rez = max(rez, query(pos * 2, l, mid, st, dr));

    if(mid < dr)
       rez = max(rez, query(pos * 2 + 1, mid + 1, r, st, dr));

    return rez;
}
main()
{
    int n, m;
    in >> n >> m;

    for(int i = 1; i <= n; i++)
        in >> v[i];

    build(1, 1, n);

    while(m--)
    {
        int q, x, y;
        in >> q >> x >> y;

        if(q == 0)
            out << query(1, 1, n, x, y) << '\n';
        else
            update(1, 1, n, x, y);
    }
}