Cod sursa(job #2677729)

Utilizator HannaLieb Hanna Hanna Data 27 noiembrie 2020 11:49:45
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

int n, m, t, x, y, gyok;
vector<int>v,maxi;

void Update(int ind, int val)
{
    v[ind] = val;

    int maxii = -1;
    int kezd = (ind - 1) / gyok * gyok + 1;
    int veg = ((ind - 1) / gyok + 1) * gyok;

    for (int i = kezd; i <= veg; ++i) maxii = max(maxii, v[i]);

    maxi[(ind - 1) / gyok + 1] = maxii;
}

long long Query(int l, int r)
{
    int akt_max = -1;

    while (l <= r && l % gyok != 1) akt_max = max(akt_max, v[l]), ++l;

    while (r >= l && r % gyok != 0) akt_max = max(akt_max, v[r]), --r;

    int k = (l - 1) / gyok + 1;
    int v = (r - 1) / gyok + 1;

    if (l <= r)
        for (int i = k; i <= v; ++i) akt_max = max(akt_max, maxi[i]);

    return akt_max;
}

int main()
{
    cin >> n >> m;
    gyok = sqrt(n);
    v.resize(n + 1, 0);
    
    maxi.resize((n - 1) / gyok + 2, -1);
    int k = 0;

    for (int i = 1; i <= n; ++i)
    {
        cin >> v[i];
        k = (i - 1) / gyok + 1;

        if (v[i] > maxi[k]) maxi[k] = v[i];
    }


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

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

    return 0;
}