Cod sursa(job #1841304)

Utilizator stefanmereutaStefan Mereuta stefanmereuta Data 5 ianuarie 2017 15:08:55
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
//batog
#include <iostream>
#include <fstream>
#include <math.h>
#include <stdio.h>

using namespace std;

#define MAX 100000

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

    int N, M, v[MAX], batog[500], op, a, b, rad;

    fin >> N >> M;

    rad = ceil(sqrt(N));

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

    for (int i = 0; i < rad && i * rad < N; i++) {
        batog[i] = v[rad * i];

        for (int j = rad * i + 1; j < rad * (i + 1); j++) {
            if (v[j] > batog[i]) {
                batog[i] = v[j];
            }
        }
    }

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

        if (op == 0) {
            a--;
            b--;

            int maxim = v[a];

            if (a / rad == b / rad) {
                for (int i = a + 1; i <= b; i++) {
                    if (v[i] > maxim) {
                        maxim = v[i];
                    }
                }
            } else {
                for (int i = a + 1; i < a / rad * rad + rad; i++) {
                    if (v[i] > maxim) {
                        maxim = v[i];
                    }
                }

                for (int i = (a - 1) / rad + 1; i < (b + 1) / rad; i++) {
                    if (batog[i] > maxim) {
                        maxim = batog[i];
                    }
                }

                for (int i = b / rad * rad; i <= b; i++) {
                    if (v[i] > maxim) {
                        maxim = v[i];
                    }
                }
            }

            fout << maxim << endl;
        } else {
            a--;
            v[a] = b;

            if (v[a] > batog[a / rad]) {
                batog[a / rad] = v[a];
            }
        }
    }

    fin.close();
    fout.close();

    return 0;
}