Cod sursa(job #2736788)

Utilizator alisavaAlin Sava alisava Data 3 aprilie 2021 21:29:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
#define maxN 100005
#define Lson(x) (2 * x)
#define Rson(x) (2 * x + 1)


using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[maxN], aint[maxN * 4];
int n, m;
int answer;

void GenAint(int nod, int left, int right)
{
    if(left == right)
    {
        aint[nod] = v[left];
        return;
    }
    int mid = (left + right) / 2;
    GenAint(Lson(nod), left, mid);
    GenAint(Rson(nod), mid + 1, right);
    aint[nod] = max(aint[Lson(nod)], aint[Rson(nod)]);
}
void Update(int nod, int left, int right, int &poz, int &val)
{
    if(left == right && left == poz)
    {
        aint[nod] = val;
        return;
    }
    int mid = (left + right) / 2;
    if(poz <= mid)
        Update(Lson(nod), left, mid, poz, val);
    else
        Update(Rson(nod), mid + 1, right, poz, val);
    aint[nod] = max(aint[Lson(nod)], aint[Rson(nod)]);
}
void Query(int nod, int left, int right, int &lQuery, int &rQuery)
{
    if(lQuery <= left && right <= rQuery)
    {
        answer = max(answer, aint[nod]);
        return;
    }
    int mid = (left + right) / 2;
    if( lQuery <= mid )
        Query(Lson(nod), left, mid, lQuery, rQuery);
    if( mid < rQuery )
        Query(Rson(nod), mid + 1, right, lQuery, rQuery);
}


int main()
{
    int obt, a, b;
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    GenAint(1, 1, n);
    for(int j = 1; j <= m; j++)
    {
        fin >> obt >> a >> b;
        if(obt == 0)
        {
            answer = 0;
            Query(1, 1, n, a, b);
            fout << answer << "\n";
        }
        else
            Update(1, 1, n, a, b);
    }




    return 0;
}