Cod sursa(job #1142748)

Utilizator manutrutaEmanuel Truta manutruta Data 14 martie 2014 09:58:12
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MAXN 100005
#define MAXA 1000

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

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

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

int query(int x, int y)
{
    int st = (1 << 30), dr = -1, mx = 0;
    for (int i = 1; i * size <= n; i++) {
        if (x < (i - 1) * size + 1 && i * size < y) {
            if (st < (i - 1) * size) st = (i - 1) * size;
            dr = i * size + 1;
            mx = max(mx, asqrt[i]);
        }
    }

    if (st == (1 << 30) || dr == -1) st = dr = y;

    for (int i = x; i <= st; i++) {
        mx = max(mx, a[i]);
    }
    for (int i = dr; i <= y; i++) {
        mx = max(mx, a[i]);
    }
    return mx;
}

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

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

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

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

        switch (op) {
            case 0: cout << query(x, y) << '\n'; break;
            case 1: update(x, y); break;
        }
    }
}