Cod sursa(job #2677737)

Utilizator HannaLieb Hanna Hanna Data 27 noiembrie 2020 11:59:19
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 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,ind,val,l,r,akt_max;
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) 
        if(v[i]>maxii) 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)
    {
        if (v[l] > akt_max) akt_max = v[l];
        ++l;
    }

    while (r >= l && r % gyok != 0)
    {
        if (v[r] > akt_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)
        if (maxi[i] > akt_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)
        {
            ind = x;
            val = y;
            {
                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)
                    if (v[i] > maxii) maxii = v[i];

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

        }
        else
        {
            akt_max = -1;
            l = x;
            r = y;

            while (l <= r && l % gyok != 1)
            {
                if (v[l] > akt_max) akt_max = v[l];
                ++l;
            }

            while (r >= l && r % gyok != 0)
            {
                if (v[r] > akt_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)
                    if (maxi[i] > akt_max) akt_max = maxi[i];

            cout << akt_max << "\n";
        }
    }

    return 0;
}