Cod sursa(job #1138128)

Utilizator manutrutaEmanuel Truta manutruta Data 9 martie 2014 16:13:12
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MAXN 100005

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

int n, m;
int a[MAXN];
int sq[MAXN], size;

void update(int poz, int val)
{
    a[poz] = val;

    int i = (poz + size - 1) / size;

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

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

    int i = (st + size - 1) / size;
    if (mx < sq[i]) {
        for (int j = st; j <= size * i; j++) {
            mx = max(mx, a[j]);
        }
    }

    i = (dr + size - 1) / size;
    if (mx < sq[i]) {
        for (int j = size * (i - 1) + 1; j <= dr; j++) {
            mx = max(mx, a[j]);
        }
    }

    return mx;
}

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

    size = 0;
    while (size * size <= n) size++;
    size--;

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

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