Cod sursa(job #1919445)

Utilizator victorpapa98Papa Victor-Alexandru victorpapa98 Data 9 martie 2017 19:30:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
# include <cstdio>
# include <algorithm>
using namespace std;

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

const int N_MAX = 100010;
const int ARB_MAX = 4 * N_MAX;

int n, m;
int maxim;

int v[N_MAX];
int arb[ARB_MAX];

void answer_query(int nod, int left, int right, int query_left, int query_right){
    if (query_left <= left && right <= query_right){
        maxim = max(maxim, arb[nod]);
    }
    else{
        int mid = (left + right) / 2;
        int left_son = nod << 1;
        int right_son = left_son + 1;

        if (mid >= query_left)
            answer_query(left_son, left, mid, query_left, query_right);

        if (mid < query_right)
            answer_query(right_son, mid+1, right, query_left, query_right);
    }
}

void update(int nod, int left, int right, int poz, int val){
    if (left == right){
        arb[nod] = val;
    }
    else{
        int mid = (left + right) / 2;
        int left_son = nod << 1;
        int right_son = left_son + 1;

        if (poz <= mid)
            update(left_son, left, mid, poz, val);
        else
            update(right_son, mid+1, right, poz, val);

        arb[nod] = max(arb[left_son], arb[right_son]);
    }
}

void solve(){
    for (int i=1; i<=m; i++){
        int t, x, y;
        scanf("%d %d %d", &t, &x, &y);

        if (t == 0){
            maxim = -1e9;
            answer_query(1, 1, n, x, y);
            printf("%d\n", maxim);
        }
        else{
            v[x] = y;
            update(1, 1, n, x, y);
        }
    }
}

void read(){
    scanf("%d %d", &n, &m);

    for (int i=1; i<=n; i++){
        scanf("%d", &v[i]);
        update(1, 1, n, i, v[i]);
    }
}

int main(){
    read();
    solve();
    return 0;
}