Cod sursa(job #2220009)

Utilizator stefan.botezStefan Botez stefan.botez Data 10 iulie 2018 12:52:30
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <cstdio>

using namespace std;
int n, q, i, op, a, b, poz, val, sol, v[100001], seg[4 * 100001];
void build(int node, int l, int r)
{
    if(l==r)
    {
        seg[node] = v[r];
        return;
    }
    int m = (l + r)/2;
    build(2*node, l, m);
    build(2*node + 1, m + 1, r);
    seg[node] = max(seg[2*node], seg[2*node + 1]);
}
void update(int node, int l, int r, int poz, int val)
{
    if(l == r)
    {
        seg[node] = val;
        return;
    }
    int m = (l + r)/2;
    if(poz <= m) update(2*node, l, m, poz, val);
    else update(2*node + 1, m + 1, r, poz, val);
    seg[node] = max(seg[2*node], seg[2*node + 1]);
}
void query(int node, int l, int r, int a, int b)
{
    if(a<=l && r<=b)
        {sol = max(sol, seg[node]);return;}
    int m = (l + r)/2;
    if(a<=m) query(2*node, l, m, a, b);
    if(b>m) query(2*node+1, m+1, r, a, b);
}
int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    scanf("%d%d", &n, &m);

    for(i = 1; i <= n; i++)
        scanf("%d", &v[i]);

    build(1, 1, n);

    while(m)
    {
        scanf("%d", &op);
        if(op == 1)
        {
            scanf("%d%d", poz, val);
            update(1, 1, n, poz, val);
        }
        else
        {
            scanf("%d%d", &a, &b);
            sol = 0;
            query(1, 1, n, a, b);
            printf("%d\n", sol);
        }
        m--;
    }
    return 0;
}