Cod sursa(job #1447245)

Utilizator RazvanSSavu Razvan RazvanS Data 3 iunie 2015 22:23:01
Problema Arbori de intervale Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.39 kb
/* 
 * File:   main.c
 * Author: Razvan
 *
 * Created on June 3, 2015, 8:15 AM
 */

#include <stdio.h>
#include <stdlib.h>

#define FILE_IN "arbint.in"
#define FILE_OUT "arbint.out"

#define SIZE 1<<18

#define MAX(a,b) a >= b ? a : b;

int N, M, A[SIZE], i; 

void update(int i, int val, int a, int b, int k)
{
    if (a==b)
        A[k] = val;
    else
    {
        if (i<=(a+b)/2)
            update(i, val, a, (a+b)/2, 2*k+1);
        else
            update(i, val, (a+b)/2 + 1, b, 2*k+2);
        A[k] = MAX(A[2*k+1], A[2*k+2]);
    }
}

int query(int s, int e, int a, int b, int k)
{
    if (a==s && e==b)
        return A[k];
    int m = (a+b)/2;
    if ( e <=m )
        return query(s, e, a, m, 2*k+1);
    if ( s > m )
        return query(s, e, m+1, b, 2*k+2);
    return MAX(query(s, m, a, m, 2*k+1), query(m+1, e, m+1, b, 2*k+2));
}

/*
 * 
 */
int main(int argc, char** argv) {
    freopen(FILE_IN, "r", stdin);
    freopen(FILE_OUT, "w", stdout);
    scanf("%d %d", &N, &M);
    int a, b, x;
    for(i=1;i<=N;++i)
    {
        scanf("%d", &x);
        update(i, x, 1, N, 0);
    }
    
    for(i=1;i<=M;++i)
    {
        scanf("%d %d %d", &x, &a, &b);
        if (x)
        {
            update(a, b, 1, N, 0);
        }
           
        else
            printf("%d\n", query(a, b, 1, N, 0));
    }
    return (EXIT_SUCCESS);
}