Cod sursa(job #201288)

Utilizator romocoderRomo Coder romocoder Data 30 iulie 2008 11:11:28
Problema Arbori de intervale Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
//@romocoder

#include <cstdio>
#include <iostream>

using namespace std;
/***************************************************
AI de aflat maxim / min pe un interval

/**************************************************/
#define AIMAX 400040
typedef int AITYPE;

AITYPE treeAI[400040];
void updateAI(int nod, int a, int b, int at, AITYPE val) {
     if (a > b) return;
     if (a == b) {if (at == a) treeAI[nod] = val; return;}
     int mij = (a + b) / 2;
     updateAI(2*nod, a, mij, at, val);
     updateAI(2*nod+1, mij+1, b, at, val);
     treeAI[nod] = 0;
     if (a <= mij) treeAI[nod] = treeAI[2*nod];
     if (mij + 1 <= b && treeAI[nod*2 + 1] > treeAI[nod]) treeAI[nod] = treeAI[2*nod+1];
     }
AITYPE getAI(int nod, int a, int b, int l, int r) {
       if (a > b) return 0;
       if (r < a || l > b) return 0;
       if (a == b) return treeAI[nod];
       if (l <= a &&  r >= b) return treeAI[nod];
       int mij = a + b; mij /= 2;
       AITYPE mx = getAI(2*nod, a, mij, l, r);
       AITYPE mx2 = getAI(2*nod+1, mij+1, b, l, r);
       if (mx > mx2) mx2 = mx;
       return mx2;
       }
/////////////////////////////////////////////////////////////////////
int main() {
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int N, M;
    cin >> N >> M;
    int i, j, k;
    for (i = 1; i <= N; ++i) {
        int X;
        cin >> X;
        updateAI(1, 1, N, i, X);
        }
    while (M--) {
          int A, B, C;
          cin >> A >> B >> C;
          if (A == 1) {updateAI(1, 1, N, B, C); continue;}
          cout << getAI(1, 1, N, B, C) << '\n';
          }
    return 0;
    }