Cod sursa(job #2699852)

Utilizator Iulia_DianaIulia Diana Iulia_Diana Data 25 ianuarie 2021 23:56:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int val[100005], arb[400005];
void build(int st, int dr, int nod)
{
    if(st==dr)
    {
        arb[nod]=val[st];
    }
    else
    {
        int mij=(st+dr)/2;
        build(st, mij, nod*2);
        build(mij+1, dr, nod*2+1);
        arb[nod]=max(arb[2*nod], arb[2*nod+1]);
    }
}
void update(int st, int dr, int nod, int ind, int vall)
{
    if(st==dr)
    {
        val[ind]=vall;
        arb[nod]=vall;
    }
    else
    {
        int mij=(st+dr)/2;
        if(ind<=mij)   update(st, mij, nod*2, ind, vall);
        else update(mij+1, dr, nod*2+1, ind, vall);
        arb[nod]=max(arb[2*nod+1], arb[2*nod]);
    }
}
int query(int st, int dr, int nod, int i, int f)
{
    if(st>f || dr<i)   return -1;
    if(st>=i && dr<=f)   return arb[nod];
    int mij=(st+dr)/2;
    int rez1=query(st, mij, nod*2, i, f);
    int rez2=query(mij+1, dr, nod*2+1, i, f);
    return max(rez1, rez2);
}
int main()
{
    int n, m;  fin >> n >> m;
    for(int i=1; i<=n; i++)  fin >> val[i];
    build(1, n, 1);
    for(int j=1; j<=m; j++)
    {
        int tip, a, b;  fin >> tip >> a >> b;
        if(tip==0)  fout << query(1, n, 1, a, b) << "\n";
        else   update(1, n, 1, a, b);
    }
    return 0;
}