Cod sursa(job #3312643)

Utilizator RaduCalisovCalisovRadu RaduCalisov Data 29 septembrie 2025 12:22:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
using namespace std;
vector<int> arb;
vector<int> v;

void crt(int st,int dr,int pos){
    if(st==dr)
        arb[pos] = v[st];
    else{
        int mid = (st+dr)/2;
        int c1 = pos*2;
        int c2 = pos*2 + 1;

        crt(st,mid,c1);
        crt(mid+1,dr,c2);

        arb[pos] = max(arb[c1],arb[c2]);
    }
}

void upd(int st,int dr,int pos,int id,int val){
    if(st==dr and st==id)
        arb[pos] = val;
    else{
        int mid = (st+dr)/2;
        int c1 = pos*2;
        int c2 = pos*2 + 1;
        
        if(st<=id and id<=mid)
            upd(st,mid,c1,id,val);
        if(mid+1<=id and id<=dr)
            upd(mid+1,dr,c2,id,val);

        arb[pos] = max(arb[c1],arb[c2]);
    }
}

int afis(int st,int dr,int pos,int fl,int fr,int maxim){
    if(fl<=st and dr<=fr)
        return max(maxim,arb[pos]);
    else if(st!=dr){
        int mid = (st+dr)/2;
        int c1 = pos*2;
        int c2 = pos*2 + 1;

        if(fl<=mid)
            maxim = max(afis(st,mid,c1,fl,fr,maxim),maxim);
        if(mid+1<=fr)
            maxim = max(afis(mid+1,dr,c2,fl,fr,maxim),maxim);

        return maxim;
    }
}

int main() {
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");

	int n,m;
    cin>>n>>m;
    v.resize(n+1);
    arb.resize(n*4);
    for(int i=1;i<=n;i++)
    cin>>v[i];
    
    crt(1,n,1);

    for(int i=1;i<=m;i++){
        int c,x,y;
        cin>>c>>x>>y;
        
        if(c==0)
            cout<<afis(1,n,1,x,y,0)<<"\n";
        else
            upd(1,n,1,x,y);
    }
}