Cod sursa(job #3246041)

Utilizator nistor_dora_valentinaNistor Dora Valentina nistor_dora_valentina Data 1 octombrie 2024 17:04:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>

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