Cod sursa(job #2817599)

Utilizator LukyenDracea Lucian Lukyen Data 13 decembrie 2021 21:46:38
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;

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

long int elem[100000], nr_elem, tree[400000];
long int i, j;

void init_tree(int ind, int st, int dr)
{
    if (st == dr)
        tree[ind] = elem[st];
    else
    {
        int mid = (st + dr) / 2;
        init_tree(ind * 2, st, mid);
        init_tree(ind * 2 + 1, mid + 1, dr);
        tree[ind] = max(tree[ind * 2], tree[ind * 2 + 1]);
    }
}

void actualizare(int ind, int st, int dr, int poz, int val)
{
    if (st == dr)
        tree[ind] = val;
    else
    {
        int middle = (st + dr) / 2;
        if (poz >= middle + 1)
            actualizare(ind * 2 + 1, middle + 1, dr, poz, val);
        else
            actualizare(ind * 2, st, middle, poz, val);
        tree[ind] = max(tree[ind * 2], tree[ind * 2 + 1]);
    }
}

int maxt(int ind, int st, int dr, int q_st, int q_dr)
{
    if (st >= q_st && q_dr >= dr)
        return tree[ind];

    else
    {
        int middle = (st + dr) / 2;
        if (q_st >= middle + 1)
            return maxt(ind * 2 + 1, middle + 1, dr, q_st, q_dr);
        else if (q_dr <= middle)
            return maxt(ind * 2, st, middle, q_st, q_dr);
        else
            return max(maxt(ind * 2 + 1, middle + 1, dr, q_st, q_dr), maxt(ind * 2, st, middle, q_st, q_dr));
    }
}

int main()
{
    int task, nr_task, a, b;

    fin >> nr_elem >> nr_task;
    for (i = 1; i <= nr_elem; i++)
        fin >> elem[i];

    init_tree(1, 1, nr_elem);
    for (i = 1; i <= nr_task; i++)
    {
        fin >> task;
        fin >> a >> b;
        if (task == 0)
            fout << maxt(1, 1, nr_elem, a, b) << "\n";
        else
            actualizare(1, 1, nr_elem, a, b);
    }

    return 0;
}