Cod sursa(job #2849834)

Utilizator XyanEusebiu Pusca Xyan Data 15 februarie 2022 20:45:53
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct st {
    int val;
    int l, r;
};
pair <int, int> v[100010];
st t[200010];
int gen(int pos, int l, int r)
{
    t[pos].l = l;
    t[pos].r = r;
    if (l == r)
    {
        t[pos].val = v[l].first;
        v[l].second = pos;
        return v[l].first;
    }
    int mid = (l + r) / 2;
    int val1 = gen(pos * 2, l, mid);
    int val2 = gen(pos * 2 + 1, mid + 1, r);
    t[pos].val = max(val1, val2);
    return t[pos].val;
}

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

void update(int pos)
{
    t[pos].val = max(t[pos * 2].val, t[pos * 2 + 1].val);
    if (pos > 1)
        update(pos / 2);
}

int main()
{
    int N, M;
    fin >> N >> M;
    for (int i = 1; i <= N; i++)
    {
        fin >> v[i].first;
    }
    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, x, y) << endl;
        }
        else
        {
            t[v[x].second].val = y;
            update(v[x].second / 2);
        }
    }
    return 0;
}