Cod sursa(job #297326)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 5 aprilie 2009 12:36:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>

#define maxim(a, b) ((a > b) ? a : b)

int N, M;
int A[262144];

void update(int nod, int left, int right, int poz, int val)
{
    if (left == right)
        A[nod] = val;
    else
    {
        int m = (left + right) / 2;
        if (poz <= m)
            update(2*nod,left,m,poz,val);
        else
            update(2*nod+1,m+1,right,poz,val);
        A[nod] = maxim(A[2*nod], A[2*nod+1]);
    }
}

int query(int nod, int left, int right, int a, int b)
{
    if (a <= left && right <= b)
        return A[nod];
        
    int m = (left+right)/2;
    int i1 = 0, i2 = 0;
    if (a <= m)
        i1 = query(2*nod, left, m, a, b);
    if (b > m)
        i2 = query(2*nod+1, m+1, right, a, b);
    return maxim(i1, i2);
}

int main()
{
    int i, x, y, tip;
    
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for (i = 1; i <= N; ++i)
    {
        scanf("%d", &x);
        update(1, 1, N, i, x);
    }
    
    while (M--)
    {
        scanf("%d %d %d", &tip, &x, &y);
        if (tip == 0)
            printf("%d\n", query(1, 1, N, x, y));
        else
            update(1, 1, N, x, y);
    }

    return 0;
}