Cod sursa(job #2631835)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 1 iulie 2020 13:07:03
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <algorithm>

using namespace std;
 
int tree[4*100000+1], c[100001];
 
void build(int v, int tl, int tr)
{
    if(tl==tr)
    {
        tree[v]=c[tl];
        return;
    }
    int tm=(tl+tr)/2;
    build(2*v, tl, tm);
    build(2*v+1, tm+1, tr);
    tree[v]=max(tree[2*v], tree[2*v+1]);
}
 
void update(int v, int tl, int tr, int i, int x)
{
    if(i>tr || i<tl)
        return;
    if(tl==tr)
    {
        tree[v]=x;
        return;
    }
 
    int tm=(tl+tr)/2;
    update(2*v, tl, tm, i, x);
    update(2*v+1, tm+1, tr, i, x);
    tree[v]=max(tree[2*v], tree[2*v+1]);
}
 
int query(int v, int tl, int tr, int l, int r)
{
    if(tl>r || tr<l)
        return -1;
    if(l<=tl && tr<=r)
        return tree[v];
    int tm=(tl+tr)/2, x, y;
    x=query(2*v, tl, tm, l, r);
    y=query(2*v+1, tm+1, tr, l, r);
    return max(x, y);
}
 
int main()
{
    freopen ("arbint.in", "r", stdin);
    freopen ("arbout.out", "w", stdout);
    int N, M, p, a, b;
    scanf("%d %d", &n, &m);
    for(int i=1;i<=N;++i)
        fin>>c[i];
    build(1, 1, N);
 
    for(int i=0;i<M;++i)
    {
        scanf(“%d %d %d”, &p, &a, &b);
        if(p==0)
            printf("%d", query(1, 1, N, a, b));
        else
            update(1, 1, N, a, b);
    }
    return 0;
}