Cod sursa(job #1846363)

Utilizator Walrus21andrei Walrus21 Data 12 ianuarie 2017 16:33:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
#include <time.h>
#include <algorithm>
#define N 262147

using namespace std;

int i, n, m, h, a, b, mx, A[N];
bool o;

void up(int k, int l, int r, int p, int val)
{
    if(l == r)
        A[k] = val;
    else
    {
        int m = (l + r) / 2;
        if(p <= m)
            up(2 * k, l, m, p, val);
        else
            up(2 * k + 1, m + 1, r, p, val);
    A[k] = max(A[2 * k], A[2 * k + 1]);
    }
}

void q(int k, int l, int r)
{
    if(a <= l && r <= b)
    {
        if(A[k] > mx) mx = A[k];
    }
    else
    {
        int m = (l + r) / 2;
        if(a <= m)
            q(2 * k, l, m);
        if(b > m)
            q(2* k + 1, m + 1, r);
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &a);
        up(1, 0, n - 1, i, a);
    }
    while((1 << h) <= n)
        h++;
    for(i = 0; i < m; i++)
    {
        scanf("%d%d%d", &o, &a, &b);
        a--;
        if(o)
            up(1, 0, n - 1, a, b);
        else
        {
            b--;
            mx = 0;
            q(1, 0, n - 1);
            printf("%d\n", mx);
        }
    }
    return 0;
}