Cod sursa(job #638602)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 21 noiembrie 2011 01:26:35
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <cstdio>
#define N 131075

int n, m;
int a[N];
int b[N];
void createTree(int nod, int st, int dr) {
    if(st == dr) {
        b[nod] = st;
        return;
    }
    int mij = (st + dr) / 2;
    createTree(2 * nod, st, mij);
    createTree(2 * nod + 1, mij + 1, dr);
    if(a[b[2 * nod]] > a[b[2 * nod + 1]])
        b[nod] = b[2 * nod];
    else
        b[nod] = b[2 * nod + 1];

}
void update(int nod, int st, int dr, int l) {
    if (st == dr) {
        return;
    }
    int mij = (st + dr) / 2;
    if(l <= mij)
     update(2 * nod, st, mij, l);
    else
     update(2 * nod + 1, mij + 1, dr, l);
    if(a[b[2 * nod]] > a[b[2 * nod + 1]])
        b[nod] = b[2 * nod];
    else
        b[nod] = b[2 * nod + 1];
}
int query(int nod, int st, int dr, int leftdat, int rightdat) {
    if((leftdat <= st) && (rightdat >= dr))
     return b[nod];
    else {
        int mij = (st + dr) / 2;
        int left = 0;
        int right = 0;
        if (mij < leftdat) {
            if (dr >= leftdat)
             return query(2 * nod + 1, mij + 1, dr, leftdat, rightdat);
        }
        else
         if (mij >= leftdat && mij < rightdat) {
              left = query(2 * nod, st, mij, leftdat, rightdat);
              right = query(2 * nod + 1, mij + 1, dr, leftdat, rightdat);
              if (a[left] > a[right]) return left;
              return right;
         }
        else {
            if(st <= rightdat) {
                return query(2 * nod, st, mij, leftdat, rightdat);
            }
        }

    }
}
int main() {

    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i = 1; i <= n; i++)
     scanf("%d",&a[i]);
    createTree(1, 1, n);
    for(int i = 1; i <= m; i++) {
        int cod, l, r;
        scanf("%d %d %d",&cod,&l,&r);
        if(cod == 0) {
            printf("%d\n", a[query(1, 1, n, l, r)]);
        }
        else {
            a[l] = r;
            update(1, 1, n, l);
        }
    }
    return 0;
}