Cod sursa(job #1349893)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 20 februarie 2015 15:46:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>
using namespace std;

int N, M;
int A[100001];
int ai[700001];
int c, a, b;

int recalc(int a, int b, int poz) {
    if(a == b)
        return ai[poz] = A[a];
    else {
        int x, y;
        x = recalc(a, (a + b) / 2, poz * 2);
        y = recalc((a + b) / 2 + 1, b, poz * 2 + 1);
        return ai[poz] = (x > y ? x : y);
    }
}

int change(int a, int b, int x, int tow, int poz) {
    if(a == b) {
        ai[poz] = tow;
        return tow;
    }
    int tmp, tmp2, med;
    med = (a + b) / 2;
    if(x > med) {
        tmp = change(med + 1, b, x, tow, 2 * poz + 1);
        tmp2 = ai[2 * poz];
    } else {
        tmp = change(a, med, x, tow, 2 * poz);
        tmp2 = ai[2 * poz + 1];
    }
    if(tmp > tmp2)
        ai[poz] = tmp;
    else ai[poz] = tmp2;
    return ai[poz];
}

int query(int a, int b, int st, int dr, int poz) {
    int rez, x, y;
    if(st == dr)
        return ai[poz];
    if(a <= st && b >= dr)
        return ai[poz];
    int med;
    med = (st + dr) / 2;
    rez = 0;
    if(a <= med) {
        x = query(a, b, st, med, 2 * poz);
        if(x > rez)
            rez = x;
    }
    if(b > med) {
        y = query(a, b, med + 1, dr, 2 * poz + 1);
        if(y > rez)
            rez = y;
    }
    return rez;
}

int main() {
    int i, j;
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d %d", &N, &M);
    for(i = 1; i <= N; i++)
        scanf("%d", &A[i]);
    recalc(1, N, 1);
    for(i = 1; i <= M; i++) {
        scanf("%d %d %d", &c, &a, &b);
        if(c == 1) {
            change(1, N, a, b, 1);
        } else {
            printf("%d\n", query(a, b, 1, N, 1));
        }
    }
    return 0;
}