Cod sursa(job #3268385)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 14 ianuarie 2025 21:20:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
#define cin ci
#define cout co
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int Nmax = 100001;
const int blocksize = 350;
int n, m, c, val, pos, ans, v[Nmax], bat[305], start, fin;
int main()
{
    cin >> n >> m;
    for(int i=0; i<n; i++)
        cin >> v[i];
    for(int i=0; i<n; i++)
        bat[i / blocksize] = max(bat[i / blocksize], v[i]);
    while(m--)
    {
        cin >> c;
        if(c)
        {
            cin >> pos >> val;
            pos--;
            if(bat[pos / blocksize] == v[pos] && v[pos] > val)
            {
                bat[pos / blocksize] = v[pos] = val;

                int st = pos / blocksize * blocksize;
                int dr = (pos / blocksize + 1) * (blocksize);
                int pos_block = pos / blocksize;

                for(int i=st; i<dr; i++)
                    bat[pos_block] = max(bat[pos_block], v[i]);
            }
            else
            {
                v[pos] = val;
                bat[pos / blocksize] = max(bat[pos / blocksize], val);
            }
        }
        else
        {
            cin >> start >> fin;
            start--;
            fin--;
            ans = 0;
            int lb = start / blocksize;
            int rb = fin / blocksize;
            for(int i=start; i<= fin && start /blocksize == i / blocksize; i++)
                ans = max(ans, v[i]);

            for(int i = lb + 1; i <= rb - 1; i++)
                ans = max(ans, bat[i]);

            for(int i = fin; i >= start && fin / blocksize == i / blocksize; i--)
                ans = max(ans, v[i]);

            cout << ans << '\n';
        }
    }
    return 0;
}