Cod sursa(job #1966279)

Utilizator mariakKapros Maria mariak Data 15 aprilie 2017 07:06:41
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define maxN 100002
#define lson (node << 1) + 1
#define rson (node << 1) + 2
#define inf 1000000002

FILE *fin  = freopen("arbint.in", "r", stdin);
FILE *fout = freopen("arbint.out", "w", stdout);

using namespace std;
int N, M, a[maxN];
int ST[maxN];

void build(int node, int left, int right){
    if(left == right)
        ST[node] = a[left];
    else{
        int mid = (left + right) / 2;
        build(lson, left, mid);
        build(rson, mid + 1, right);
        ST[node] = max(ST[lson], ST[rson]);
    }
}

void update(int node, int left, int right, int pos, int value){
    if(left == right)
        ST[node] = value;
    else{
        int mid = (left + right) / 2;
        if(pos <= mid)
            update(lson, left, mid, pos, value);
        else update(rson, mid + 1, right, pos, value);
        ST[node] = max(ST[lson], ST[rson]);
    }
}

int query(int node, int left, int right, int x, int y){
    if(x <= left && right <= y)
        return ST[node];
    else{
        int mid = (left + right) / 2, ans = -inf;
        if(x <= mid)
            ans = max(ans, query(lson, left, mid, x, y));
        if(y > mid)
            ans = max(ans, query(rson, mid + 1, right, x, y));
        return ans;
    }
}

int main(){
    scanf("%d %d", &N, &M);
    for(int i = 1; i <= N; ++ i)
        scanf("%d", &a[i]);
    build(0, 1, N);
    while(M --){
        int type, a, b;
        scanf("%d %d %d", &type, &a, &b);
        if(type == 0)
            printf("%d\n", query(0, 1, N, a, b));
        else update(0, 1, N, a, b);
    }
    return 0;
}