Cod sursa(job #3172261)

Utilizator ioanabaduIoana Badu ioanabadu Data 20 noiembrie 2023 13:47:55
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <iostream>
#include <cmath>
#include <stdio.h>

using namespace std;

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

#define N_MAX 100005
#define SQ_N 700
// int const BATOG_SIZE = SQ_N + 2; // numarul de intervale

int v[N_MAX], batog[SQ_N];
int n, querries, sqn;

void build (){ // ok
    for (int i=0; i<n; ++i){
        batog[i / sqn] = max(batog[i/sqn], v[i]);
    }
}

void update (int a, int b){ // ok
    batog[a/sqn] = 0;
    v[a] = b;

    int start = (a / sqn) * sqn;
    int finish = start + sqn;

    for (int i=start; i<finish; ++i)
        batog[i/sqn] = max(batog[i/sqn], v[i]); // se adapteaza doar intervalul respectiv
}

int getMax (int left, int right){
    int firstInterval, lastInterval, result = 0;

    firstInterval = (left + sqn - 1) / sqn * sqn;
    lastInterval = right / sqn * sqn;

    while (left <= right && left < firstInterval)
        result = max(result, v[left++]);
    while (right >= left && right >= lastInterval)
        result = max(result, v[right--]);

    firstInterval /= sqn;
    lastInterval /= sqn;

    while (firstInterval < lastInterval)
        result = max(batog[firstInterval++], result);
    
    return result;
}

int main (){
    in >> n >> querries;
    sqn = sqrt(n);
    for (int i=0; i<n; ++i) // trebuie sa incep de la 0, pentru ca accesez un element impartind la SQ_N
        in >> v[i];

    build();

    int operand, a, b;

    for (int i=1; i<=querries; ++i){
        in >> operand >> a >> b;
        if (operand == 0){
            out << getMax(a-1, b-1) << '\n';
        }
        else{
            update(a-1, b); // incep cu iindicii de la 0
        }
        // for (int k=0; k<n; k++)
        //     cout << v[k] << ' ';
        // cout << '\n';
        // for (int j=0; j<n; j++)
        //     cout << batog[j] << ' ';
        // cout << '\n';
    }
    return 0;
}