Cod sursa(job #769174)

Utilizator mi5humihai draghici mi5hu Data 18 iulie 2012 17:07:45
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>

#define NMAX 100001

using namespace std;

int N;
int Arb[2 * NMAX];

int getMax(int Poz, int L, int R, int from, int to) {
     if (from <= L && R <= to) {
         return Arb[Poz]; 
     }
     int M = (L + R) / 2;
     int maxL = 0, maxR = 0;
     if (from <= M) {
         maxL = getMax(2 * Poz, L, M, from, to);              
     }
     if (to >= M + 1) {
         maxR = getMax(2 * Poz + 1, M + 1, R, from, to);    
     }
     return (maxL > maxR ? maxL : maxR);     
}

void update(int Poz, int L, int R, int PozUpdate, int Val) {
     if (L == R)  {
          Arb[Poz] = Val;
          return;
     }
     int M = (L + R) / 2;
     if (PozUpdate <= M) {
         update(2 * Poz, L, M, PozUpdate, Val);              
     } else {
         update(2 * Poz + 1, M + 1, R, PozUpdate, Val);       
     }
     Arb[Poz] = Arb[2 * Poz] > Arb[2 * Poz + 1] ? Arb[2 * Poz] : Arb[2 * Poz + 1]; 
}

void read_() {
     int M, cmd, a, b, Maxx, aux;
     scanf("%d%d", &N, &M);
     for (int i = 1; i <= N; i++) {
        scanf("%d", &aux);
        update(1, 1, N, i, aux);
     }      
     
     for (int i = 0; i < M; i++) {
        scanf("%d%d%d", &cmd, &a, &b);
        switch (cmd) {
            case 0: 
                Maxx = getMax(1, 1, N, a, b);
                printf("%d\n", Maxx);
                break;
            case 1:
                update(1, 1, N, a, b);
                break;
            default:
                break;       
        }
     }
}

int main() {
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    
    read_();
    
    return 0;
}