Cod sursa(job #1447257)

Utilizator RazvanSSavu Razvan RazvanS Data 3 iunie 2015 22:49:17
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.37 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, a, b, max; 

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

void query(int s, int e, int k)
{
    if (a<=s && e<=b)
    {
        max = MAX(max, A[k]);
        return;
    }
    int m = (s+e)/2;
    if ( a <=m )
        query(s, m, 2*k+1);
    if ( m < b )
        query(m+1, e, 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 x;
    for(i=1;i<=N;++i)
    {
        scanf("%d", &b);
        a = i;
        update(1, N, 0);
    }
    
    for(i=1;i<=M;++i)
    {
        scanf("%d %d %d", &x, &a, &b);
        if (x)
        {
            update(1, N, 0);
        }
           
        else
        {
            max = 0;
            query(1, N, 0);
            printf("%d\n", max);
        }
            
    }
    return (EXIT_SUCCESS);
}