Cod sursa(job #3270315)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 22 ianuarie 2025 20:37:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 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 Block = 350;
int n, m, v[Nmax], bat[305], start, fin, c, val, pos, ans;
int main()
{
    cin >> n >> m;
    for(int i=0; i<n; i++)
        cin >> v[i];
    for(int i=0; i<n; i++)
        bat[i / Block] = max(bat[i / Block], v[i]);
    while(m--)
    {
        cin >> c;
        if(c)
        {
            cin >> pos >> val;
            pos--;
            if(bat[pos / Block] == v[pos] && v[pos] > val)
            {
                bat[pos / Block] = v[pos] = val;

                int st = pos / Block * Block;
                int dr = (pos / Block + 1) * Block;
                int posblock = pos / Block;

                for(int i = st; i<dr; i++)
                    bat[posblock] = max(bat[posblock], v[i]);
            }
            else
            {
                v[pos] = val;
                bat[pos / Block] = max(bat[pos / Block], val);
            }


        }
        else
        {
            cin >> start >> fin;
            start--;
            fin--;
            int lb = start / Block;
            int rb = fin / Block;
            int ans = -1;
            int endi = (lb + 1) * Block;
            if(rb == lb)
                for(int i=start; i<=fin; i++)
                    ans = max(ans, v[i]);
            else
            {
                for(int i=start; i<endi; i++)
                    ans = max(ans, v[i]);

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

                for(int i=rb * Block; i<=fin; i++)
                    ans = max(ans, v[i]);
            }

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