Cod sursa(job #3159874)

Utilizator TeodorVTeodorV TeodorV Data 22 octombrie 2023 13:31:21
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NAint=1<<19;

int n;
int aint[NAint];

void buildAint(int node=0, int st=1, int dr=n)
{
    if(st==dr)
    {
        fin>>aint[node];
        return;
    }
    int mij=(st+dr)/2;
    buildAint(2*node+1, st, mij);
    buildAint(2*node+2, mij+1, dr);
    aint[node]=max(aint[2*node+1], aint[2*node+2]);
}
void updateAint(const int& pos, const int& newVal, int node=0, int st=1, int dr=n)
{
    if(pos<st || dr<pos)
        return;
    if(st==dr)
    {
        aint[node]=newVal;
        return;
    }
    int mij=(st+dr)/2;
    updateAint(pos, newVal, 2*node+1, st, mij);
    updateAint(pos, newVal, 2*node+2, mij+1, dr);
    aint[node]=max(aint[2*node+1], aint[2*node+2]);
}
int queryAint(const int& qst, const int& qdr, int node=0, int st=1, int dr=n)
{
    if(dr<qst || qdr<st)
        return -1;
    if(qst<=st && dr<=qdr)
        return aint[node];
    int mij=(st+dr)/2;
    return max(queryAint(qst, qdr, 2*node+1, st, mij), queryAint(qst, qdr, 2*node+2, mij+1, dr));
}

int main()
{
    int m;
    fin>>n>>m;
    buildAint();
    for(int q=1; q<=m; q++)
    {
        int C,a,b;
        fin>>C>>a>>b;
        if(C==0)
        {
            fout<<queryAint(a, b)<<'\n';
        }
        else
        {
            updateAint(a, b);
        }

    }
    return 0;
}