Cod sursa(job #1349862)

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

int N, M;
int A[100001];
int ai[100001];
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 poz) {
    if(a == b) {
        ai[poz] = x;
        return x;
    }
    int tmp, tmp2;
    if(x > (a + b + 1) / 2) {
        tmp = change((a + b) / 2 + 1, b, x, 2 * poz + 1);
        tmp2 = ai[2 * poz];
    } else {
        tmp = change(a, (a + b) / 2, x, 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;
    if(st == dr)
        return ai[poz];
    if(a <= st && b >= dr)
        return ai[poz];
    int med;
    med = (st + dr) / 2;
    if(a <= med && b > med) {
        rez = query(a, b, st, med, 2 * poz);
        x = query(a, b, med + 1, dr, 2 * poz + 1);
        if(x > rez)
            rez = x;
        return rez;
    } else if(b <= med)
        return query(a, b, st, med, 2 * poz);
    else return query(a, b, med + 1, dr, 2 * poz + 1);
}

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, 1);
        } else {
            printf("%d\n", query(a, b, 1, N, 1));
        }
    }
    return 0;
}