Cod sursa(job #2481346)

Utilizator BogdanRazvanBogdan Razvan BogdanRazvan Data 26 octombrie 2019 19:37:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

const int N = 100005;

int arb[4 * N], a[N];

void build(int st, int dr, int nod)
{
    if(st == dr) {
        arb[nod] = a[st];
        return ;
    }

    int mid = (st + dr) >> 1;

    build(st, mid, nod * 2);
    build(mid + 1, dr, nod * 2 + 1);

    arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
void update(int position, int val, int st, int dr, int nod)
{
    if(st == dr) {
        arb[nod] = val;
        return ;
    }
    int mid = (st + dr) >> 1;

    if(position <= mid) update(position, val, st, mid, nod * 2);
    else update(position, val, mid + 1, dr, 2 * nod + 1);
    arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}

void query(int x, int y, int st, int dr, int nod, int & mx)
{
    if(x <= st && dr <= y) {
        mx = max(mx, arb[nod]);
        return ;
    }

    int mid = (st + dr) >> 1;
    if(x <= mid) query(x, y, st, mid, 2 * nod, mx);
    if(mid + 1 <= y) query(x, y, mid + 1, dr, 2 * nod + 1, mx);
}

int main()
{

    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    int n, m, mx = -1;

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

    build(1, n, 1);

    for(int i = 1; i <= m; ++i) {
        int type, x, y;
        scanf("%d%d%d", &type, &x, &y);
        if(type == 1) {
            update(x, y, 1, n, 1);
        }
        else {
            mx = -1;
            query(x, y, 1, n, 1, mx);
            printf("%d\n", mx);
        }
    }
    return 0;
}