Cod sursa(job #3357451)

Utilizator malita.dragosMalita Dragos-Ionut malita.dragos Data 9 iunie 2026 20:28:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>

using namespace std;

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

int N,M,q,a,b,A[100005],arb[400005];

void construct(int nod,int st,int dr){
    if(st == dr){
        arb[nod] = A[st];
        return;
    }
    int m=(st+dr)/2;
    construct(2*nod,st,m);
    construct(2*nod+1,m+1,dr);
    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}

void actualizare(int nod,int st,int dr,int x,int y){
    if(st == dr){
        arb[nod] = y;
        return;
    }
    int m = (st+dr)/2;
    if(x<=m){
        actualizare(2*nod,st,m,x,y);
    }
    else{
        actualizare(2*nod+1,m+1,dr,x,y);
    }
    arb[nod] = max(arb[2*nod],arb[2*nod+1]);
}

int cautare(int nod,int st,int dr,int a,int b){
    if(a<=st && b>=dr){
        return arb[nod];
    }
    int maxs=0,maxd=0;
    int m = (st+dr)/2;
    if(a<=m){
        maxs=cautare(2*nod,st,m,a,b);
    }
    if(b>m){
        maxd=cautare(2*nod+1,m+1,dr,a,b);
    }
    return max(maxs,maxd);
}

int main()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++){
        fin>>A[i];
    }
    construct(1,1,N);
    for(int i=1;i<=M;i++){
        fin>>q>>a>>b;
        if(q == 0){
            fout<<cautare(1,1,N,a,b)<< '\n';
        }
        else{
            actualizare(1,1,N,a,b);
        }
    }
    fin.close();
    fout.close();
    return 0;
}