Cod sursa(job #1644596)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 10 martie 2016 00:33:11
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
# include <cstdio>
# include <algorithm>

using namespace std;

FILE *fin = fopen("arbint.in", "rt");
FILE *fout = fopen("arbint.out", "wt");

const int MAXN = 100005;
int Arb[4*MAXN];
int n, m, tmp, x, y;

void update(int nod, int st, int dr, int i, int j) {
    if (st >= i && dr <= i)
        Arb[nod] = j;
    else {
        int mid = st + (dr-st)/2,
            f1 = (nod << 1),
            f2 = f1 + 1;

        if (i <= mid)
            update(f1, st, mid, i, j);
        else
            update(f2, mid+1, dr, i, j);

        Arb[nod] = max(Arb[f1], Arb[f2]);
    }
}

int query(int nod, int st, int dr, int i, int j) {
    if (i <= st && j >= dr)
        return Arb[nod];

    int mid, p1, p2, f1, f2;
    mid = st + (dr-st)/2;
    f1 = (nod << 1);
    f2 = f1 + 1;

    p1 = p2 = 0;
    if (i <= mid)
        p1 = query(f1, st, mid, i, j);
    else
        p2 = query(f2, mid+1, dr, i, j);

    return max(p1, p2);
}

int main() {
    fscanf(fin, "%d%d", &n, &m);
    for (int i=1; i<=n; ++i) {
        fscanf(fin, "%d", &x);
        update(1, 1, n, i, x);
    }

    for (int i=1; i<=n; ++i) {
        fscanf(fin, "%d%d%d", &tmp, &x, &y);
        if (tmp == 0)
            fprintf(fout, "%d\n", query(1, 1, n, x, y));
        else
            update(1, 1, n, x, y);
    }
    return 0;
}