Cod sursa(job #2268756)

Utilizator mihaicivMihai Vlad mihaiciv Data 25 octombrie 2018 11:35:44
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#define NMAX 100100
#define BMAX 1000
#define VMAX 1000000000
using namespace std;

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

int n, m;
int v[NMAX];
int b[BMAX];
int Size;

void creare() {

    int maxim = 0;
    for (int i = 1; i <= Size * Size; ++i) {
        maxim = max(maxim, v[i]);
        if (i % Size == 0) {
            b[i / Size] = maxim;
            maxim = 0;
        }
    }

}

int getMaxim(int st, int dr) {
    int maxim = 0;
    int startPoint = 0;
    int currentSize;

    if (st % Size == 1) {
        startPoint = st / Size;
    } else {
        startPoint = ( (st - 1) / Size) + 1;

    }


    currentSize = startPoint * Size + 1;
    for (int i = st; i < currentSize && i <= dr; ++i) {
        maxim = max(maxim, v[i]);
    }

    while (currentSize + Size <= dr) {
        maxim = max(maxim, b[startPoint + 1]);
        startPoint ++;
        currentSize = currentSize + Size;
    }



    for (int i = currentSize; i <= dr; ++i) {
        maxim = max(maxim, v[i]);
    }
    return maxim;
}

int main() {


    f >> n >> m;
    Size = sqrt(n);

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

    creare();

    while (m --) {
        int Tip, st, dr;
        f >> Tip >> st >> dr;
        if (Tip == 0) {
            g << getMaxim(st, dr) << "\n";
        } else {
            int pos = (st + Size - 1) / Size;
            v[st] = dr;
            creare();
        }
    }

    return 0;
}