Cod sursa(job #3178834)

Utilizator 21CalaDarius Calaianu 21Cala Data 2 decembrie 2023 16:14:36
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cmath>

#define NMAX 100005
#define NLOGMAX 18

using namespace std;
const string nume_fisier = "arbint";
ifstream fin(nume_fisier + ".in");
ofstream fout(nume_fisier + ".out");

int arb[200005], pos, val, start, finish, maxi;
int n, m;

int max(int a, int b)
{
    return (a > b ? a : b);
}

void update(int nod, int left, int right)
{
    if (left == right)
    {
        arb[nod] = val;
        return;
    }
    int m = left + right;
    m /= 2;
    if (pos <= m)
        update(2 * nod, left, m);
    else
        update(2 * nod + 1, m + 1, right);
    arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}

void querry(int nod, int left, int right)
{
    if (start <= left && right <= finish)
    {
        if (maxi < arb[nod])
            maxi = arb[nod];
        return;
    }
    int m = left + right;
    m /= 2;
    if (start <= m)
        querry(2 * nod, left, m);
    if (finish > m)
        querry(2 * nod + 1, m + 1, right);
}

int main()
{
    fin >> n >> m;
    for (pos = 1; pos <= n; pos++)
    {
        fin >> val;
        update(1, 1, n);
    }
    for (int i = 0; i < m; ++i)
    {
        int c, a, b;
        fin >> c >> a >> b;
        if (c)
        {
            pos = a;
            val = b;
            update(1, 1, n);
        }
        else
        {
            start = a;
            finish = b;
            maxi = -1;
            querry(1, 1, n);
            fout << maxi << '\n';
        }
    }
}