Cod sursa(job #1789131)

Utilizator horatiucheval2Horatiu Andrei Cheval horatiucheval2 Data 26 octombrie 2016 18:41:20
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <cmath>
const int MAX = 100000;

int main(){
    std::ifstream fin("arbint.in");
    std::ofstream fout("arbint.out");

    int n, m;
    int v[MAX], maxs[1000];
    fin >> n >> m;

    int sqrt_n = std::sqrt(n);

    for(int i = 0; i < n; i++){
        fin >> v[i];
    }

    //constructia maximelor partiale
    for(int i = 0; i * i <= n; i++){
        int maxim = v[i * sqrt_n];
        for(int j = i * sqrt_n; j < (i + 1) * sqrt_n && j < n; j++){
            if(v[j] > maxim){
                maxim = v[j];
            }
        }
        maxs[i] = maxim;
    }

    for(int i = 0; i < m; i++){
        int op, a, b;
        fin >> op >> a >> b;

        if(op == 0){
            a--;
            b--;
            int firstMax = a / sqrt_n + 1;
            int lastMax = b / sqrt_n - 1;

            int maxim = v[a];
            for(int j = a; j < firstMax * sqrt_n; j++){
                if(v[j] > maxim){
                    maxim = v[a];
                }
            }
            for(int j = firstMax; j <= lastMax; j++){
                if(maxs[j] > maxim){
                    maxim = maxs[j];
                }
            }
            for(int j = lastMax * sqrt_n + 1; j <= b; j++){
                if(v[j] > maxim){
                    maxim = v[j];
                }
            }
            fout << maxim << "\n";
        }else if(op == 1){
            a--;
            v[a] = b;
            int gr = a / sqrt_n;
            int maxim = v[gr * sqrt_n];
            for(int j = gr * sqrt_n; j < (gr + 1) * sqrt_n; j++){
                if(v[j] > maxim){
                    maxim = v[j];
                }
            }
            maxs[gr] = maxim;
        }
    }


    fin.close();
    fout.close();
    return 0;
}