Cod sursa(job #2606045)

Utilizator MohamedXXXhaide sarpili MohamedXXX Data 26 aprilie 2020 19:55:17
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <cmath>
#include <iostream>

#define MAX 100005
using namespace std;

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

int arr[MAX], query[MAX];
int n, m;
int part;
void update(int a, int b) {
    if (query[(a - 1) / part + 1] > b)
        query[(a - 1) / part + 1] = b;
    arr[a] = b;
}
int getMax(int a, int b) {
    int max = arr[a];
    int i = a;
    while ((i - 1) % part != 0 and i < b) {
        if (max < arr[i])
            max = arr[i];
        i ++;
    }
    while(i + part <= b) {
        if (max < query[(i - 1) / part + 1])
            max = query[(i - 1) / part + 1];
        i += part;
    }
    while (i <= b) {
        if (max < arr[i])
            max = arr[i];
        i ++;
    }
    return max;
}

int main() {
    fin >> n >> m;

    part = sqrt(n);

    for (int i = 1;i <= n;i ++)
        fin >> arr[i];

    int i;
    for (i = 1;i <= n - part + 1;i += part) {
        int max = arr[i];
        for (int j = i;j <= part + i - 1;j ++)
            if (max < arr[j])
                max = arr[j];
        query[(i - 1) / part + 1] = max;
    }
    int max = arr[i];
    int j = i;
    for (i = 1;i <= n;i ++) {
        if (max < arr[i])
            max = arr[i];
    }

    query[(j - 1) / part + 1] = max;

    int operation, left, right;

    for (int i = 1;i <= m;i ++) {
        fin >> operation >> left >> right;
        if (operation == 0) {
            fout << getMax(left, right) << '\n';
        } else {
            update(left, right);
        }
    }
    return 0;
}