Cod sursa(job #3356521)

Utilizator natalia_denisa14Natalia natalia_denisa14 Data 2 iunie 2026 10:08:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
#define nmax 100002
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,arr[nmax],sol,aint[nmax*4],op,x,y;
void build(int nod, int st, int dr) {
    if (st==dr) {
        aint[nod]=arr[st];
        return;
    }
    int mid=(st+dr)/2;
    build(2*nod,st,mid);
    build(2*nod+1,mid+1,dr);
    aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
void update(int nod, int st, int dr, int poz, int val) {
    if (st==dr) {
        aint[nod]=val;
        return;
    }
    int mid=(st+dr)/2;
    if (poz<=mid) update(2*nod,st,mid,poz,val);
    if (poz>mid) update(2*nod+1,mid+1,dr,poz,val);
    aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
void query(int nod, int st, int dr, int left, int right) {
    if (left>dr || right<st) return;
    if (left<=st && dr<=right) {
        sol=max(sol,aint[nod]); return ;
    }
    int mid=(st+dr)/2;
    query(2*nod,st,mid,left,right);
    query(2*nod+1,mid+1,dr,left,right);
}
int main() {
    f>>n>>m;
    for (int i=1;i<=n;i++) f>>arr[i];
    build(1,1,n);
    for (int i=1;i<=m;i++) {
        f>>op>>x>>y;
        if (op==0) {
            query(1,1,n,x,y);
            g<<sol<<'\n';
            sol=0;
        }
        else update(1,1,n,x,y);
    }
}