Cod sursa(job #2268366)

Utilizator ValentinSavoiuFMI Savoiu Valentin-Marian ValentinSavoiu Data 24 octombrie 2018 18:51:17
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>// BATOG PENTRU LABORATOR ASD
#include <vector>
#include <queue>
#define NMAX 100002
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int a[NMAX], i, N, x, ok, d = 1, pozMin[1001], op, M, y;
const int infinit = ((1 << 30) - 1) * 2 + 1;
int Querry(int st, int dr) {
    int poz = st;
    while (st % d != 0 && st <= dr) {
        if (a[st] > a[poz]) poz = st;
        st++;
    }
    while (st + d <= dr) {
        if (a[pozMin[st / d]] > a[poz]) poz = pozMin[st / d];
        st += d;
    }
    while (st <= dr) {
        if (a[st] > a[poz]) poz = st;
        st++;
    }
    return poz;
}
void Update(int poz, int val) {
    int Bucket = poz / d;
    if(poz == pozMin[Bucket] ) {
        a[poz] = val;
        for(int i = Bucket * d; i < (Bucket + 1) * d; i++)
            if (a[i] > a[pozMin[Bucket]]) pozMin[Bucket] = i;
    }
    else if (val > a[pozMin[Bucket]]) pozMin[Bucket] = poz;
    a[poz] = val;
}
int main() {
    f>>N>>M;
    for (i = 0; i < N; i++) {
        f>>a[i];
    }
    while (d * d <= N) ++d;
    for (i = 0; i < N; i++) {
        if (i % d == 0) pozMin[i / d] = i;
        if (a[i] > a[pozMin[i / d]]) pozMin[i / d] = i;
    }
    for (i = 0; i < M; i++) {
        f>>op>>x>>y;
        if (op == 0) g<<a[Querry(x-1, y-1)]<<'\n';
        else Update(x-1, y);
    }
    return 0;
}