Cod sursa(job #2932674)

Utilizator k20ySabaceag Marius k20y Data 3 noiembrie 2022 17:29:27
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;

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

const int N = 1e5;

int aint[4*N+5];
int v[N+5];

void Build(int nod, int st, int dr)
{
    if(st == dr)
    {
        aint[nod] = v[st];
        return;
    }

    int mij = (st+dr)/2;

    Build(2*nod,st,mij);
    Build(2*nod+1,mij+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;
        return;
    }

    int mij = (st+dr)/2;

    if(poz <= mij) Update(2*nod, st, mij, poz, val);
    if(poz > mij) Update(2*nod+1, mij+1, dr, poz, val);

    aint[nod] = max(aint[2*nod],aint[2*nod+1]);
}

int Query(int nod, int st, int dr, int a, int b)
{
    if(a <= st && dr <= b) return aint[nod];

    int mij = (st+dr)/2;
    int rez1=0,rez2=0;

    if(a <= mij) rez1=Query(2*nod, st, mij, a, b);
    if(b > mij) rez2=Query(2*nod+1, mij+1, dr, a, b);

    return max(rez1,rez2);
}

int main()
{
    int n,m; in>>n>>m;

    for(int i=1;i<=n;i++)
        in>>v[i];

    Build(1,1,n);

    while(m--)
    {
        int tip,a,b; in>>tip>>a>>b;

        if(!tip) out<<Query(1,1,n,a,b)<<'\n';
        else Update(1,1,n,a,b);
    }
}