Cod sursa(job #2300930)

Utilizator ValentinSavoiuFMI Savoiu Valentin-Marian ValentinSavoiu Data 12 decembrie 2018 13:01:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#define dim 100001
using namespace std;

ifstream f ("arbint.in");
ofstream g ("arbint.out");

int tree[4 * dim + 13];
int maxi, N, M;
void Update(int nod, int currL, int currR, int pos, int val) {
     if ( currL == currR ) {
          tree[nod] = val;
          return;
     }

     int mid = currL + (currR - currL) / 2;
     if ( pos <= mid ) Update(2 * nod, currL, mid, pos, val);
     else              Update(2 * nod + 1, mid + 1, currR, pos, val);

     tree[nod] = max(tree[2 * nod], tree[2 * nod + 1]);
}

void Query(int nod, int currL, int currR, int queL, int queR) {
     if ( queL <= currL && currR <= queR ) {
          if ( maxi < tree[nod] ) maxi = tree[nod];
          return;
     }

     int mid = currL + (currR - currL) / 2;
     if ( queL <= mid ) Query(2 * nod, currL , mid, queL, queR);
     if ( mid < queR ) Query(2 * nod + 1, mid + 1, currR, queL, queR);
}
int main() {
    int x, a, b;
    f >> N >> M;
    for (int i = 1; i <= N; i++) {
        f >> x;
        Update(1, 1, N, i, x);
    }

    for ( int i = 1; i <= M; i++ ) {
        f >> x >> a >> b;
        if ( x == 0 ) {
             maxi = -1;
             Query(1, 1, N, a, b);
             g << maxi << '\n';
        }
        else    Update(1, 1, N, a, b);

    }
}