Cod sursa(job #2269263)

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

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

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

void creare() {

    long long 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;
        }
    }

}

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

    /// iau cel mai mic inceput >= st

    long long int stPoint = 0;

    if (st % Size == 1) {
        stPoint = st / Size + 1;
    } else {
        stPoint = (st - 1 + Size) / Size + 1;
    }
    /// iau cel mai mic punct <= dr

    long long int finPoint = 0;

    if (dr % Size == 0) {
        finPoint = dr / Size;
    } else {
        finPoint = dr / Size;
    }

    for (int i = stPoint; i <= finPoint; ++i) {
        maxim = max(maxim, b[i]);
    }

    if (st % Size != 1) {
        for (int i = st; i <= dr && i % Size != 1; ++i) {
            maxim = max(maxim, v[i]);
        }
    }
    if (dr % Size != 0) {
        for (int i = dr;i >=st && i % Size != 0; --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 --) {
        long long int Tip, st, dr;
        f >> Tip >> st >> dr;
        if (Tip == 0) {
            g << getMaxim(st, dr) << "\n";
        } else {
            long long int pos = 0;
            if (st % Size == 0) {
                pos = st / Size;
            } else {
                pos = st / Size + 1;
            }
            if (b[pos] <= dr || v[st] == b[pos]) {
                v[st] = dr;
                creare();
            }
            v[st] = dr;
        }
    }

    return 0;
}