Cod sursa(job #2907367)

Utilizator pifaDumitru Andrei Denis pifa Data 29 mai 2022 22:54:57
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N = 1e5;

int a[N + 1], tree[4 * N + 1];

int n;

int number_of_queries;

void build(int node, int start, int finish)
{
    if(start == finish)
    {
        tree[node] = a[start];
    }
    else
    {
        int mid = (start + finish) / 2;
        build(2 * node, start, mid);
        build(2 * node + 1, mid + 1, finish);
        tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }
}

void update(int node, int start, int finish, int idx, int val)
{
    if(start == finish)
    {
        a[idx] = val;
        tree[node] = val;
    }
    else
    {
        int mid = (start + finish) / 2;
        if(start <= idx && idx <= mid)
        {
            update(2 * node, start, mid, idx, val);
        }
        else
        {
            update(2 * node + 1, mid + 1, finish, idx, val);
        }
        tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }
}

int query(int node, int start, int finish, int l, int r)
{
    if(r < start || l > finish) /// sunt in afara intervalului
    {
        return 0;
    }
    if(start >= l && finish <= r)
    {
        return tree[node];
    }
    int mid = (start + finish) / 2;
    int p1 = query(2 * node, start, mid, l, r);
    int p2 = query(2 * node + 1, mid + 1, finish, l, r);
    return max(p1, p2);
}

int main()
{
    in >> n >> number_of_queries;
    for(int i = 1; i <= n; i++)
    {
        in >> a[i];
        update(1, 1, n, i, a[i]);
    }
    //build(1, 1, 1);
    for(int test_case = 1; test_case <= number_of_queries; test_case++)
    {
        int op, l, r;
        in >> op;
        in >> l >> r;
        if(op == 1)
        {
            update(1, 1, n, l, r);
        }
        else if(op == 0)
        {
            out << query(1, 1, n, l, r) << '\n';
        }
    }
    return 0;
}