Cod sursa(job #2338604)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 7 februarie 2019 17:22:00
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define MAXN 100000

int v[MAXN];
int n, m;
int *tree;

void build(int arr[]){
    tree = new int[2 * n - 1];
    tree--;

    for (int i = 0; i < n; i++)
        tree[n + i] = arr[i];

    for (int i = n - 1; i > 0; --i)
        tree[i] = std::max(tree[i << 1], tree[i << 1 | 1]);
}

void updateTreeNode(int p, int value){
    p += n;
    tree[p] = value;

    while (p > 1) {
        p >>= 1;
        tree[p] = std::max(tree[p << 1], tree[p << 1 | 1]);
    }
}

int query(int l, int r){
    l += n - 1;
    r += n + 1;
    int res = -1;
    while (r - l > 1) {
        if(l != 0 && (l & 1) == 0)
            res = std::max(res, tree[++l]);
        if(r != 1 && (r & 1) == 1)
            res = std::max(res, tree[--r]);
        l >>= 1;
        r >>= 1;
    }
    return res;
}

int main(){
    FILE*fi,*fo;
    fi = fopen("arbint.in","r");
    fo = fopen("arbint.out","w");

    fscanf(fi,"%d%d", &n, &m);
    for(int i = 0; i < n; i++)
        fscanf(fi,"%d", &v[i]);

    build(v);

    for(int i = 1; i <= m; i++){
        int c, a, b;
        fscanf(fi,"%d%d%d", &c, &a, &b);
        if(c == 0)
            fprintf(fo,"%d\n", query(a - 1, b - 1));
        else
            updateTreeNode(a - 1, b);
    }

    return 0;
}