Cod sursa(job #2982906)

Utilizator VerestiucAndreiVerestiuc Andrei VerestiucAndrei Data 21 februarie 2023 09:46:31
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int i,j;
int arb[400005];
int v[100005];
void build(int poz,int st,int dr)
{
    if (st==dr)
    {
        arb[poz]=v[st];
        return;
    }
    int mij=(st+dr)/2;
    build(poz*2,st,mij);
    build(poz*2+1,mij+1,dr);
    arb[poz]=max(arb[2*poz],arb[2*poz+1]);
}
void update(int nod,int st,int dr,int poz,int val)
{
    if (st==dr)
    {
        arb[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if (mij>=poz) update(nod*2,st,mij,poz,val);
    else  update(nod*2+1,mij+1,dr,poz,val);
    arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
int query(int nod,int st,int dr,int L,int R)
{
    if (L<=st && dr<=R) return arb[nod];
    int rez=0;
    int mij=(st+dr)/2;
    if (L<=mij)
        rez=max(rez,query(nod*2,st,mij,L,R));
    if (R>mij)
        rez=max(rez,query(nod*2+1,mij+1,dr,L,R));
    return rez;
}
int main()
{
    fin>>n>>m;
    for (i=1; i<=n; i++)
    {
        fin>>v[i];
    }
    build(1,1,n);
    int tip,a,b;
    for (i=1; i<=m; i++)
    {
        fin>>tip>>a>>b;
        if (tip==1) update(1,1,n,a,b);
        else  fout<<query(1,1,n,a,b)<<'\n';
    }
    return 0;
}