Cod sursa(job #3362939)

Utilizator CorvinJudge0Corvin Judge CorvinJudge0 Data 13 august 2026 10:25:08
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

int v[100001];
vector <int> segtree(400001);
int n,m;

void build(int node) {
    if (node>=n) segtree[node]=v[node-n+1];
    else {
        build(node*2);
        build(node*2+1);
        segtree[node]=max(segtree[node*2],segtree[node*2+1]);
    }
}

void update(int a,int b) {
    v[a]=b;
    a+=n-1;
    segtree[a]=b;
    a/=2;
    while (a>=1) {
        segtree[a]=max(segtree[2*a],segtree[2*a+1]);
        a/=2;
    }
}

int query(int a, int b, int start, int end, int node) {
    int rasp=0;
    int mij=(start+end)/2;
    if (a<=start && end<=b) {
        rasp=max(rasp,segtree[node]);
        return rasp;
    }
    if (a<=mij) {
        rasp=max(rasp,query(a,b,start,mij,2*node));
    }
    if (b>mij) {
        rasp=max(rasp,query(a,b,mij+1,end,2*node+1));
    }
    return rasp;
}

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

    int aux=log2(n);
    n=pow(2,(aux+1));
    build(1);

    for (int i=1;i<=m;i++) {
        int cer,a,b;
        fin >> cer >> a >> b;
        if (cer==0) {
            fout << query(a,b,1,n,1) << "\n";
        }else {
            update(a,b);
        }
    }
    return 0;
}