Cod sursa(job #2694169)

Utilizator HannaLieb Hanna Hanna Data 8 ianuarie 2021 13:04:50
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#include <cmath>
//#include <algorithm>

using namespace std;

ifstream cin("arbint.in");
ofstream cout("arbint.out");

int n, m, t, x, y, hossz;

struct adat
{
    int bal, jobb;
    int max;
};
vector<adat>v;

vector<int>szamok;

void Felepit(int i, int bal, int jobb)
{
    v[i].bal = bal;
    v[i].jobb = jobb;
    v[i].max = 0;

    if (bal != jobb)
    {
        Felepit(i * 2, bal, (bal + jobb) / 2);
        Felepit(i * 2 + 1, (bal + jobb) / 2 + 1, jobb);
        v[i].max = max(v[i * 2].max, v[i * 2 + 1].max);
    }
    else v[i].max = szamok[bal];
}

void Update(int i, int ind, int val)
{
    if (v[i].bal == v[i].jobb && v[i].bal == ind)
    {
        v[i].max = val;
    }
    else if (ind <= (v[i].bal + v[i].jobb) / 2)
    {
        Update(i * 2, ind, val);
        v[i].max = max(v[i * 2].max, v[i * 2 + 1].max);
    }
    else
    {
        Update(i * 2 + 1, ind, val);
        v[i].max = max(v[i * 2].max, v[i * 2 + 1].max);
    }
}

long long Query(int i, int l, int r)
{
    if (v[i].bal == l && v[i].jobb == r) return v[i].max;
    else
    {
        int fele = (v[i].bal + v[i].jobb) / 2;
        if (r <= fele) return Query(i * 2, l, r);
        else if (l > fele) return Query(i * 2 + 1, l, r);
        else return max(Query(i * 2, l, fele),Query(i * 2 + 1, fele + 1, r));
    }
}

int main()
{
    cin >> n >> m;
    szamok.resize(n + 1, 0);
    for (int i = 1; i <= n; ++i)
        cin >> szamok[i];

    hossz = pow(2, log2(n - 1) + 2);
    v.resize(hossz);
    Felepit(1, 1, n);

    while (m)
    {
        --m;
        cin >> t >> x >> y;

        if (t == 1) Update(1, x, y);
        else cout << Query(1, x, y) << "\n";
    }

    return 0;
}