Cod sursa(job #2850325)

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

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

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

void update(int pos, int l, int r, int up, int uv)
{
    if (l == up && r == up)
    {
        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]);
}

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;
}