Cod sursa(job #3155438)

Utilizator gianiferSpita Alexandru-Mihai gianifer Data 8 octombrie 2023 12:44:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

#define INF 0x3F3F3F3F
#define N_MAX 100050

using namespace std;

ifstream fin("arbint.in");

ofstream fout("arbint.out");

int n, m;
int maxim;
int v[N_MAX];

int a[4 * N_MAX];

void build(int nod, int st, int dr)
{
    if (st == dr)
    {
        a[nod] = v[st];
    }
    else
    {
        int mij = (st + dr) / 2;
        build(2 * nod, st, mij);
        build(2 * nod + 1, mij + 1, dr);
        a[nod] = max(a[2 * nod], a[2 * nod + 1]);
    }
}

void update(int nod, int st, int dr, int x, int y)
{
    if (st == dr)
    {
        a[nod] = y;
    }
    else
    {
        int mij = (st + dr) / 2;
        if (x <= mij)
        {
            update(2 * nod, st, mij, x, y);
        }
        if (x > mij)
        {
            update(2 * nod + 1, mij + 1, dr, x, y);
        }
        a[nod] = max(a[2 * nod], a[2 * nod + 1]);
    }
}
void query(int nod, int st, int dr, int x, int y)
{
    if (x <= st && dr <= y)
    {
        maxim = max(maxim, a[nod]);
    }
    else
    {
        int mij = (st + dr) / 2;
        if (x <= mij)
        {
            query(2 * nod, st, mij, x, y);
        }
        if (y > mij)
        {
            query(2 * nod + 1, mij + 1, dr, x, y);
        }
    }
}
int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        fin >> v[i];
    }
    build(1, 1, n);
    for (; m--;)
    {
        int op, x, y;
        fin >> op >> x >> y;
        if (op == 0)
        {
            maxim = -INF;
            query(1, 1, n, x, y);
            fout << maxim<<'\n';
        }
        else
        {
            update(1, 1, n, x, y);
        }
    }
}