Cod sursa(job #2850371)

Utilizator XyanEusebiu Pusca Xyan Data 16 februarie 2022 18:07:15
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int v[100010];
int t[400010];
void gen(int pos, int l, int r)
{
    if (l == r)
    {
        t[pos] = v[l];
        return;
    }
    int mid = (l + r) / 2;
    gen(pos * 2, l, mid);
    gen(pos * 2 + 1, mid + 1, r);
    t[pos] = max(t[pos * 2], t[pos * 2 + 1]);
}

int query(int pos, int l, int r, int ql, int qr)
{
    if (ql > qr) return -1;
    if (l == ql && r == qr)
        return t[pos];
    int mid = (l + r) / 2;
    return max(query(pos * 2, l, mid, ql, min(qr, mid)), query(pos * 2 + 1, mid + 1, r, max(ql, mid + 1), qr));
}

void update(int pos, int l, int r, int up, int uv)
{
    if (l == r)
    {
        t[pos] = uv;
        return;
    }
    int mid = (l + r) / 2;
    if (up <= mid)
    {
        update(pos * 2, l, mid, up, uv);
    }
    else
    {
        update(pos * 2 + 1, mid + 1, r, up, uv);
    }
    t[pos] = max(t[pos * 2], t[pos * 2 + 1]);
    return;
}

int main()
{
    int N, M;
    fin >> N >> M;
    for (int i = 1; i <= N; i++)
    {
        fin >> v[i];
    }
    gen(1, 1, N);
    int x, y;
    bool o;
    for (int i = 1; i <= M; i++)
    {
        fin >> o >> x >> y;
        if (!o)
        {
            fout << query(1, 1, N, x, y) << endl;
        }
        else
        {
            update(1, 1, N, x, y);
        }
    }
    return 0;
}