Cod sursa(job #2783298)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 14 octombrie 2021 10:35:55
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, q, op, a, b, sol;
int v[100005], aint[400005];

void build(int nod, int st, int dr){
    if(st == dr){
        aint[nod] = v[st];
        return;
    }

    int md=(dr-st)/2+st;

    build(2*nod, st, md);
    build(2*nod+1, md+1, dr);
    aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}

void update(int nod, int st, int dr, int poz, int k){
    if(st == dr){
        aint[nod]=k;
        return;
    }

    int md=(dr-st)/2+st;

    if(poz <= md)
        update(2*nod, st, md, poz, k);

    if(poz > md)
        update(2*nod+1, md+1, dr, poz, k);

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

void query(int nod, int st, int dr, int left, int right){
    if(left <= st && dr <= right){
        sol = max(sol, aint[nod]);
        return;
    }

    int md=(dr-st)/2+st;

    if(left <= md)
        query(2*nod, st, md, left, right);

    if(right > md)
        query(2*nod+1, md+1, dr, left, right);
}

int main(){
    fin>>n>>q;
    for(int i=1; i<=n; i++)
        fin>>v[i];

    build(1, 1, n);

    for(int qq=1; qq<=q; qq++){
        fin>>op>>a>>b;
        if(op == 0){
            sol=0;
            query(1, 1, n, a, b);
            fout<<sol<<"\n";
        }else
            update(1, 1, n, a, b);
    }
    return 0;
}
/*
                                          1(1, 8)
                2(1, 4)                                              3(5, 8)
    4(1, 2)                 5(3, 4)                     6(5, 6)                   7(7, 8)
8(1, 1)  9(2, 2)      10(3, 3)  11(4, 4)          12(5, 5)  13(6, 6)       14(7, 7)  15(8, 8)
*/