Cod sursa(job #1644605)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 10 martie 2016 00:39:54
Problema Arbori de intervale Scor 100
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 = 100010;
int Arb[4*MAXN];
int n, m, tmp, x, y;

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

    int mid, in1, in2, fiu;
    mid = st + (dr-st)/2;
    fiu = (nod << 1);
    in1 = in2 = 0;

    if (i <= mid)
        in1 = query(fiu, st, mid, i, j);
    if (mid < j)
        in2 = query(fiu+1, mid+1, dr, i, j);

    return max(in1, in2);
}

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 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<=m; ++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;
}