Cod sursa(job #3268196)

Utilizator keosClaudiu Ivanescu keos Data 13 ianuarie 2025 22:02:27
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <iostream>
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");
int aint[400001], n, m, a, b, q, v[10001];

void build (int nod, int st, int dr){
    if(st==dr)
        aint[nod]=v[st];
    else{
            int m=(st+dr)/2;
            build(2*nod, st, m);
            build(2*nod+1, m+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;
    else{
            int m=(st+dr)/2;
    if(poz<=m)
        update(2*nod, st, m, poz, val);
    else
        update(2*nod+1, m+1, dr, poz, val);
    aint[nod]=max(aint[2*nod], aint[2*nod+1]);
    }
}

int maxi;

void query(int nod, int st, int dr, int a, int b){
    if(st>=a && dr<=b)
        maxi=max(maxi, aint[nod]);
    else{
            int m=(st+dr)/2;
    if(a<=m)
        query(2*nod, st, m, a, b);
    if(b>m)
        query(2*nod+1, m+1, dr, a, b);
    }
}

int main()
{
    in>>n>>m;
    for(int i=1; i<=n; i++)
    in>>v[i];
    build(1, 1, n);

    for(int i=1; i<=m; i++){
            in>>q>>a>>b;
            if(q==0){
                    maxi=-1;
                    query(1, 1, n, a, b);
                    out<<maxi<<endl;
                    cout<<maxi<<endl;
            }
            else
                v[a]=b;
                update(1, 1, n, a, v[a]);
    }

    return 0;
}