Cod sursa(job #2799343)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 12 noiembrie 2021 22:07:25
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>

using namespace std;

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

const int DIM = 100005;
int v[DIM], aint[4*DIM];
int n, q, op, x, y, sol;

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);
    else
        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 lft, int rgt){

    if(lft <= st && dr <= rgt){
        sol = max(sol, aint[nod]);
        return;
    }

    int md = (dr - st) / 2 + st;
    if(lft <= md)
        query(2*nod  , st  , md, lft, rgt);

    if(rgt > md)
        query(2*nod+1, md+1, dr, lft, rgt);
}

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

    build(1, 1, n);

    while(q--){
        fin>>op>>x>>y;
        if(op == 0){
            sol = 0;
            query (1, 1, n, x, y);
            fout<<sol<<"\n";
        }else
            update(1, 1, n, x, y);
    }
    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)
*/