Cod sursa(job #2290050)

Utilizator andru47Stefanescu Andru andru47 Data 25 noiembrie 2018 18:17:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 100005;
int n, m, arb[4 * NMAX];
inline void update(int node, int st, int dr, int ind, int val)
{
    if (st == dr)
    {
        arb[node] = val;
        return ;
    }
    int mij = (st + dr) >> 1;
    if (ind <= mij)
        update(2 * node, st, mij, ind, val);
    else update(2 * node + 1, mij + 1, dr, ind, val);
    
    arb[node] = max(arb[2 * node] , arb[2 * node + 1]);
    return ;
}
inline int query(int node, int st, int dr, int cap1, int cap2)
{
    int v1 = 0, v2 = 0;
    if (st >= cap1 && dr <= cap2)
        return arb[node];
    int mij = (st + dr) >> 1;
    if (cap1 <= mij)
        v1 = query(node * 2, st, mij, cap1, cap2);
    if (cap2 > mij)
        v2 = query(node * 2 + 1, mij + 1, dr, cap1, cap2);
    return max(v1, v2);
}
int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    
    scanf("%d %d", &n, &m);
    for (int i = 1; i<=n; ++i)
    {
        int x;
        scanf("%d", &x);
        update(1 , 1 , n, i, x);
    }
    for (int i = 1; i<=m; ++i)
    {
        int instr , x , y;
        scanf("%d %d %d", &instr, &x, &y);
        if (instr == 0)
            printf("%d\n", query(1, 1 , n, x, y));
        else
            update(1, 1, n, x, y);
    }
    return 0;
}