Cod sursa(job #1899102)

Utilizator medicinedoctoralexandru medicinedoctor Data 2 martie 2017 15:27:25
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int n, m, b, x, y, s;
vector <int> a, q; // a - numerele, q - maximele pe intervale

int main()
{
    ifstream cin ("arbint.in" );
    ofstream cout("arbint.out");
    cin >> n >> m;
    s = sqrt(n);
    a.resize(n + 1);
    q.resize(s + 1);

    for (int i = 0; i < n; i++)
        cin >> a[i];

    for (int i = 0; i < a.size(); i++)
        q[i] = *(max_element(a.begin() + i * s, a.end() + (i + 1) * s ));

    for (int i = 0; i < m; i++)
    {
        cin >> b >> x >> y;
        x--;
        if (b)
        { //atribuirea
            a[x] = y;
            q[x / s] = *(max_element(a.begin() + (x / s) , a.begin() + (x / s) + 1 ));
        }
        else
        { //maximul
            y--;
            int t = -1, first_sqrt = 1 + x / s, last_sqrt = y / s;
            t = max(t, *(max_element( a.begin() + x, a.begin() + s * first_sqrt)) );
            for (int i = first_sqrt; i < last_sqrt; i++)
                t = max(t, q[i]);
            t = max(t, *(max_element( a.begin() + s * last_sqrt, a.begin() + y)) );
            cout << t << '\n';
        }
    }

    return 0;
}