Cod sursa(job #1400079)

Utilizator 4ONI2015oni2015 4ONI2015 Data 25 martie 2015 08:47:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;
int arb[400005], A[100005], t, a, b, n, m, i;
void build(int nod, int l, int r)
{
    if(l == r)
    {
        arb[nod] = A[r];
        return;
    }
    int m = (l + r) / 2, fs = 2 * nod;
    build(fs, l, m);
    build(fs + 1, m + 1, r);
    arb[nod] = max(arb[fs], arb[fs + 1]);
}
int query(int nod, int l, int r)
{
    if(a > r || b < l)
        return 0;
    if(l >= a && r <= b)
        return arb[nod];
    int m = (l + r) / 2, fs = 2 * nod;
    return max(query(fs, l, m), query(fs + 1, m + 1, r));
}
void update(int nod, int l, int r)
{
    if(l == r)
    {
        arb[nod] = b;
        return;
    }
    int m = (l + r) / 2, fs = 2 * nod;
    if(m >= a)
        update(fs, l, m );
    else
        update(fs + 1, m + 1, r);
    arb[nod] = max(arb[fs], arb[fs + 1]);
}
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", &A[i]);
    build(1, 1, n);
    for(; m; m--)
    {
        scanf("%d%d%d", &t, &a, &b);
        if(!t)
            printf("%d\n", query(1, 1, n));
        else
            update(1, 1, n);
    }
    return 0;
}