Cod sursa(job #3162227)

Utilizator PetraPetra Hedesiu Petra Data 28 octombrie 2023 17:07:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

vector<int> v, v2;
int n, m, rad;
int maxim(int a, int b)
{
    int mx = 0;
    int start = a / rad + 1, stop = b / rad;
    if (start-1 == stop)
    {
        for (int i = a; i <= b; i++)
        {
//            cout << v[i] << "\n";
            mx = max(mx, v[i]);
        }
        return mx;
    }
    for (int i = start; i < stop; i++)
        mx = max(mx, v2[i]);
    for (int i = a; i < start*rad; i++)
        mx = max(mx, v[i]);
    for (int i = stop*rad; i <= b; i++)
        mx = max(mx, v[i]);
    return mx;
}
void modif(int a, int b)
{
    v[a] = b;
    int start = a / rad;
    v2[start] = 0;
    for (int i = start*rad; i <= (start+1)*rad-1 && i < n; i++)
    {
        v2[start] = max(v2[start], v[i]);
    }
}
int main()
{
    fin >> n >> m;
    rad = sqrt(n);
    int len = 0;
    for (int i = 0; i < n; i++)
    {
        int x;
        fin >> x;
        v.push_back(x);
        if (len >= rad || i == 0)
        {
            len = 1;
            v2.push_back(x);
        }
        else if (len < rad)
        {
            len++;
            v2[v2.size()-1] = max(v2[v2.size()-1], x);
        }
    }
//    for (int i = 0; i < v2.size(); i++)
//        cout << v2[i] << " ";
//    cout << endl;

    for (int i = 0; i < m; i++)
    {
        int op, a, b;
        fin >> op >> a >> b;
        a = a - 1;
        if (op == 0)
        {
            b = b - 1;
            fout << maxim(a, b) << "\n";
        }
        else if (op == 1)
        {
            modif(a, b);
//            for (int i = 0; i < v2.size(); i++)
//                cout << v2[i] << " ";
//            cout << endl;
        }
    }
    return 0;
}