Cod sursa(job #2886036)

Utilizator AdrianDiaconitaAdrian Diaconita AdrianDiaconita Data 6 aprilie 2022 21:38:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100001;
int tree[4*NMAX];
int v[NMAX];
int N, Q, op, x, y;

void Update (int nod, int lf, int rg, int pos, int val)
{
    if (lf == rg)
    {
        tree[nod] = val;
        return;
    }
    int mid = lf + (rg - lf)/2;
    if (pos <= mid) Update(nod * 2, lf, mid, pos, val);
    else Update(nod*2+1, mid + 1, rg, pos, val);
    tree[nod] = max(tree[nod*2], tree[nod*2+1]);
}

int Query(int nod, int lf, int rg, int L , int R)
{
    if (L <= lf && rg <= R)
    {
        return tree[nod];
    }
    int mid = lf + (rg - lf)/2;
    int ans1, ans2;
    ans1 = ans2 = 0;
    if (L <= mid) ans1 = Query(nod*2, lf, mid, L, R);
    if (mid < R) ans2 = Query(nod*2+1, mid + 1, rg, L, R);
    return max(ans1, ans2);
}

int main()
{
    fin >> N >> Q;
    for (int i = 1; i <= N; ++i)
    {
        fin >> v[i];
        Update (1, 1, N, i, v[i]);
    }

    for (int i = 1; i <= Q; ++i)
    {
        fin >> op >> x >> y;

        if (op == 0)
        {
            fout << Query(1, 1, N, x, y) << '\n';
        }
        else 
        {
            Update(1, 1, N, x, y);
        }
    }
    return 0;
}