Cod sursa(job #3005487)

Utilizator PatruMihaiPatru Mihai PatruMihai Data 17 martie 2023 00:25:02
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 NMAX = 1e5 + 7;

int n, m, maxim;
int aint[4 * NMAX];

void update(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)
        update(nod * 2, left, mid, pos, val);
    else
        update(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()
{
    fin >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        int x;
        fin >> x;
        update(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
            update(1, 1, n, a, b);
    }
    return 0;
}