Cod sursa(job #1140199)

Utilizator manutrutaEmanuel Truta manutruta Data 11 martie 2014 20:02:46
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <cstring>
#include <iostream>
#include <fstream>

using namespace std;

#define INF 0x3f3f3f3f
#define MAXN 100005
#define MAXSQRT 1000

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

int n, size;
int a[MAXN];
int asqrt[MAXSQRT];

void precompute()
{
    for (int i = 1; i <= size + 1; i++) {
        for (int j = (i - 1) * size + 1; j <= i * size; j++) {
            asqrt[i] = max(asqrt[i], a[j]);
        }
    }
}

void update(int poz, int val) {
    for (int i = 1; i <= size + 1; i++) {
        if (poz <= (i - 1) * size || i * size < poz) {
            continue;
        }

        a[poz] = val;
        asqrt[i] = 0;
        for (int j = (i - 1) * size + 1; j <= i * size; j++) {
            asqrt[i] = max(asqrt[i], a[j]);
        }

        break;
    }
}

int query(int st, int dr)
{
    int mx = 0;
    for (int i = 1; i <= size + 1; i++) {
        if ((i - 1) * size < st && dr <= i * size) {
            for (int j = st; j <= dr; j++) {
                mx = max(mx, a[j]);
            }
            return mx;
        }
    }

    for (int i = 1; i <= size + 1; i++) {
        if ((i - 1) * size < st && st <= i * size) {
            for (int j = st; j <= i * size; j++) {
                mx = max(mx, a[j]);
            }
            continue;
        }
        if (st <= (i - 1) * size && i * size < dr) {
            mx = max(mx, asqrt[i]);
            continue;
        }
        if ((i - 1) * size < dr && dr <= i * size) {
            for (int j = (i - 1) * size + 1; j <= dr; j++) {
                mx = max(mx, a[j]);
            }
            continue;
        }
    }
    return mx;
}

int main()
{
    memset(a, 0, sizeof(a));
    memset(asqrt, 0, sizeof(asqrt));

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

    size = 1;
    while ((1 << size) <= n) size++;
    size--;

    precompute();

    for (int i = 1; i <= m; i++) {
        int op, x, y;
        f >> op >> x >> y;

        if (op) {
            update(x, y);
        } else {
            g << query(x, y) << '\n';
        }
    }

    f.close();
    g.close();
    return 0;
}