Cod sursa(job #2770311)

Utilizator PatruMihaiPatru Mihai PatruMihai Data 20 august 2021 14:28:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

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

const int lmax = 1e5 + 7;

int v[4 * lmax + 7];
int maxim;

void update(int pos, int l, int r, int a, int val)
{
    if (l == r)
    {
        v[pos] = val;
        return;
    }

    int mid = (l + r) / 2;

    if (a <= mid)
        update(pos * 2, l, mid, a, val);
    else
        update(pos * 2 + 1, mid + 1, r, a, val);

    v[pos] = max(v[pos * 2], v[pos * 2 + 1]);
}

void query(int pos, int l, int r, int x, int y)
{
    if (x <= l && r <= y)
    {
        maxim = max(maxim, v[pos]);
        return;
    }

    int mid = (l + r) / 2;

    if (x <= mid)
        query(pos * 2, l, mid, x, y);
    if (y > mid)
        query(pos * 2 + 1, mid + 1, r, x, y);
}

int main()
{
    int n, m;
    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 op, a, b;
        fin >> op >> a >> b;

        if (op == 0)
        {
            maxim = -1;
            query(1, 1, n, a, b);
            fout << maxim << "\n";
        }

        else
        {
            update(1, 1, n, a, b);
        }
    }
    return 0;
}