Cod sursa(job #3333322)

Utilizator mariusharabariMarius Harabari mariusharabari Data 12 ianuarie 2026 22:52:48
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
using namespace std;

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

const int AMAX = 4e5+1, NMAX= 1e5+1;

long long aint[AMAX], v[NMAX];
int n, m;

void constructie(int pos, int l, int r){
    if(l==r)
        aint[pos]=v[l];
    else{
        int m=(l+r)/2;
        constructie(2*pos, l, m);
        constructie(2*pos+1, m+1, r);
        aint[pos]=max(aint[2*pos],aint[2*pos+1]);
    }
}

long long query(int pos, int al, int ar, int l, int r){
    //cout<<pos<<' '<<al<<' '<<ar<<endl;
    if(l<=al&&ar<=r)
        return aint[pos];

    int m=(al+ar)/2;
    long long s1=0, s2=0;
    //cout<<m<<endl;

    if(m>=l)
        s1=query(2*pos, al, m, l, r);
    if(m<r)
        s2=query(2*pos+1, m+1, ar, l, r);
    return max(s1, s2);
}

void update(int pos, int l, int r, int k, int val){
    if(l==r)
        aint[pos]=val;

    else{
        int m=(l+r)/2;
        if(k<=m)
            update(2*pos, l, m, k, val);
        else
            update(2*pos+1, m+1, r, k, val);
        aint[pos]=max(aint[2*pos],aint[2*pos+1]);
    }
}

int main(){
    fin>>n>>m;
    //cout<<n<<' '<<m<<endl;
    for(int i=1;i<=n;i++)
        fin>>v[i];

    constructie(1, 1, n);
    /*for(int i=1;i<=n;i++)
        cout<<v[i]<<' ';
    cout<<endl;
    for(int i=1;i<=4*n;i++)
        cout<<i<<' '<<aint[i]<<endl;*/

    int o, a, b;
    while(m--){
        fin>>o>>a>>b;
        //cout<<o<<' '<<a<<' '<<b<<endl;
        if(o==0)
            fout<<query(1, 1, n, a, b)<<endl;
        else
            update(1, 1, n, a,b);
    }

    return 0;
}