Cod sursa(job #2207418)

Utilizator cristianritaCristian Rita cristianrita Data 25 mai 2018 17:47:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
#define maxn 500000

using namespace std;

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

int arb[maxn];
int maxim = 0;

void update(int left, int right, int node, int pos, int value) {
    if(left == right) {
        arb[node] = value;
        return;
    }

    int middle = left + (right - left) / 2;
    if(pos <= middle) update(left, middle, node * 2, pos, value);
    else update(middle + 1, right, node * 2 + 1, pos, value);

    arb[node] = max(arb[2 * node], arb[2 * node + 1]);
}

void query(int left, int right, int node, int start, int finish) {
    if(start <= left && right <= finish) {
        if(maxim < arb[node]) maxim = arb[node];
        return;
    }
    int middle = (left + right) / 2;
    if(start <= middle) query(left, middle, 2 * node, start, finish);
    if(middle < finish) query(middle + 1, right, 2 * node + 1, start, finish);
}

int main() {
    int n, m, x, y, z;
    in>>n>>m;
    for(int i = 0; i < n; i++) {
        in>>x;
        update(1, n, 1, i + 1, x);
    }

    for(int i = 0; i < m; i++) {
        in>>x>>y>>z;
        if(x == 0) {
            maxim = 0;
            query(1,n,1,y,z);
            out<<maxim<<"\n";
        }
        else update(1,n,1,y,z);
    }
}