Cod sursa(job #1844018)

Utilizator stefanmereutaStefan Mereuta stefanmereuta Data 9 ianuarie 2017 17:28:10
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
//batog
#include <iostream>
#include <fstream>
#include <math.h>
#include <stdio.h>

using namespace std;

#define MAX 100010

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 < N; 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 {
                int i, j;
                //i < inceputul segmentului urmator
                for (i = a + 1; i < a / rad * rad + rad && i <= b; i++) {
                    printf("i=%d\n", i);
                    if (v[i] > maxim) {
                        maxim = v[i];
                    }
                }

                //
                for (j = i / rad; j < (b + 1) / rad && j < rad; j++) {
                    printf("j=%d\n", j);
                    if (batog[j] > maxim) {
                        maxim = batog[j];
                    }
                }

                for (i = j * rad; i <= b; i++) {
                    printf("i=%d\n", i);
                    if (v[i] > maxim) {
                        maxim = v[i];
                    }
                }
            }

            fout << maxim << "\n";
        } else {
            a--;
            v[a] = b;

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

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

    return 0;
}