Cod sursa(job #2937120)

Utilizator PatruMihaiPatru Mihai PatruMihai Data 9 noiembrie 2022 22:35:11
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

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

const int LMAX = 1e5 + 7;

int aint[4 * LMAX + 7];
int maxim;

void build(int nod, int left, int right, int pos, int val)
{
    if(left == right)
    {
        aint[nod] = val;
        return;
    }

    int mid = (left + right) / 2;

    if(pos <= mid)
        build(nod * 2, left, mid, pos, val);
    else
        build(nod * 2 + 1, mid + 1, right, pos, val);

    aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}

void query(int nod, int left, int right, int x, int y)
{
    if(x <= left && right <= y)
    {
        maxim = max(maxim, aint[nod]);
        return;
    }

    int mid = (left + right) / 2;

    if(x <= mid)
        query(nod * 2, left, mid, x, y);
    if(y > mid)
        query(nod * 2 + 1, mid + 1, right, x, y);
}

int main()
{
    int n, m;
    fin >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        int x;
        fin >> x;
        build(1, 1, n, i, x);
    }

    for(int i = 1; i <= m; i++)
    {
        int type, a, b;
        fin >> type >> a >> b;

        if(type == 0)
        {
            maxim = INT_MIN;
            query(1, 1, n, a, b);
            fout << maxim << "\n";
        }
        else
            build(1, 1, n, a, b);
    }

    return 0;
}