Cod sursa(job #638740)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 21 noiembrie 2011 15:54:47
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#define N 262144

int n, m;
int a[N];
int b[N];
int max(int c, int d) {
    if(a[c] > a[d]) return c;
    return d;
}
int query(int l, int r) {
    int poz;
    if (l > r)
     poz = -1;
    else
     poz = r;
    int i = r;
    while(i >= l) {
     if (i - (i & -i) + 1 > l) {
        if(a[b[i]] > a[poz])
         poz = b[i];
        i = i - (i & -i);
     }
     else  {
        if (a[i] > a[poz])
          poz = i;
        i--;
        }
    }
    return poz;
}
void update(int poz, int newval) {
    a[poz] = newval;
    int i = poz;
    while(i <= n) {
        b[i] = max(poz, max(query(i - (i & -i) + 1, poz - 1), query(poz + 1, i)));
        i += (i & -i);
    }

}
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]);
     update(i, a[i]);
    }
    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(l, r)]);
        }
        else {
            update(l,r);
        }
    }
    return 0;
}