Cod sursa(job #953109)

Utilizator nicuvladNicu Vlad nicuvlad Data 24 mai 2013 21:45:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<stdio.h>
int aib[1000001] , maxim , a , b , n , m , tip;
inline int max(int a , int b)
{
    if(a > b)
        return a;
    return b;
}
void update(int nod , int st , int dr , int a , int b)
{
    if(st == dr)
    {
        aib[nod] = b;
        return ;
    }
    int med = (st + dr) >> 1;
    if(a <= med)
        update(2 * nod , st , med , a , b);
    else
        update(2 * nod + 1 , med + 1 , dr , a , b);
    aib[nod] = max(aib[nod * 2] , aib[nod * 2 + 1]);
}
void query(int nod , int st , int dr , int a , int b)
{
    if(a <= st && dr <= b)
    {
        maxim = max(maxim , aib[nod]);
        return;
    }
    int med = (st + dr) >> 1;
    if(med >= a)
        query(2 * nod , st , med , a , b);
    if(med + 1 <= b)
        query(2 * nod + 1 , med + 1 , dr , a , b);
}
int main()
{
    freopen("arbint.in" , "r" , stdin);
    freopen("arbint.out" , "w" , stdout);
    scanf("%d %d" , &n , &m);
    for(int i = 1 ; i <= n ; ++ i)
        scanf("%d" , &a) , update(1 , 1 , n , i , a);
    for(int i = 1 ; i <= m ; ++ i)
    {
        scanf("%d %d %d" , &tip , &a , &b);
        if(tip == 0)
        {
            maxim = 0;
            query(1 , 1 , n , a , b);
            printf("%d\n" , maxim);
        }
        else
            update(1 , 1 , n , a , b);
    }
}