Cod sursa(job #1910371)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 7 martie 2017 16:37:32
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <cstdio>

using namespace std;

#define DIM 400005

int arbint[DIM];
int N, M, nr, a, b, x, y, tip;

void update(int poz, int val, int nod, int in, int sf);
int query(int st, int dr, int nod, int in, int sf);

int main() {
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d %d\n", &N, &M);

    for(int i = 1; i <= N; ++i) {
        scanf("%d", &nr);

        update(i, nr, 1, 1, N);
    }

    for(int i = 1; i <= M; ++i) {
        scanf("%d", &tip);

        if(tip == 0) {
            scanf("%d %d\n", &x, &y);

            cout << query(x, y, 1, 1, N) << '\n';
        }
        else {
            scanf("%d %d\n", &a, &b);

            update(a, b, 1, 1, N);
        }
    }

    return 0;
}


void update(int poz, int val, int nod, int in, int sf) {
    if(in == sf) {
        if(in == poz) {
            arbint[nod] = val;
        }

        return ;
    }

    update(poz, val, 2 * nod, in, (in + sf) / 2);
    update(poz, val, 2 * nod + 1, (in + sf) / 2 + 1, sf);

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

int query(int st, int dr, int nod, int in, int sf) {
    if(st <= in && sf <= dr) {
        return arbint[nod];
    }

    int mij = (in + sf) / 2;

    if(mij < st) {
        return query(st, dr, 2 * nod + 1, mij + 1, sf);
    }

    if(mij >= dr) {
        return query(st, dr, 2 * nod, in, mij);
    }

    return max(query(st, dr, 2 * nod, in, mij), query(st, dr, 2 * nod + 1, mij + 1, sf));
}