Cod sursa(job #3295895)

Utilizator Mateixx1Trandafir matei Mateixx1 Data 9 mai 2025 15:20:44
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int NMAX=100010;
int n,m,ai[NMAX*4],v[NMAX],x,a,b;

void build_tree(int rad,int st,int dr) {
    if(st==dr) {
        ai[rad]=v[st];
    } else {
        int mij=(dr+st)/2;
        build_tree(rad*2,st,mij);
        build_tree(rad*2+1,mij+1,dr);
        ai[rad]=max(ai[rad*2],ai[rad*2+1]);
    }
}

void update(int rad,int st,int dr,int poz,int val) {
    if(st==dr) {
        ai[rad]=val;
    } else {
        int mij=(dr+st)/2;
        if(poz<=mij) {
            update(rad*2,st,mij,poz,val);
        } else {
            update(rad*2+1,mij+1,dr,poz,val);
        }
        ai[rad]=max(ai[rad*2],ai[rad*2+1]);
    }
}


int query(int rad,int st,int dr,int a,int b) {
    if(a<=st&&dr<=b) {
        return ai[rad];
    } else {
        int mij=(dr+st)/2,r1=0,r2=0;
        if(a<=mij) {
            r1=query(rad*2,st,mij,a,b);
        }
        if(mij<b) {
            r2=query(rad*2+1,mij+1,dr,a,b);
        }
        return max(r1,r2);
    }
}


int main() {
    f>>n>>m;
    for(int i=1; i<=n; i++) {
        f>>v[i];
    }
    build_tree(1,1,n);
    while(m--) {
        f>>x>>a>>b;
        if(x==0) {
            g<<query(1,1,n,a,b)<<"\n";
        } else {
            update(1,1,n,a,b);
        }
    }
    f.close();
    g.close();
    return 0;
}