Cod sursa(job #1222512)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 23 august 2014 14:30:45
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
using namespace std;
int i, a[200005], n, m, op, x, y;
int max(int a, int b){if (a>=b) return a; else return b;}
int min(int a, int b){if (a>=b) return b; else return a;}
void update(int poz_real){
    a[poz_real]=max(a[poz_real*2], a[poz_real*2+1]);
    if (poz_real>1) update(poz_real/2);
}
void change(int st, int dr, int poz, int poz_real, int val) {
    int mij=st+(dr-st)/2;
    if (st==dr) {a[poz_real]=val; update(poz_real/2);} else {
        if (poz<=mij) change(st, mij, poz, poz_real*2, val);
             else change(mij+1, dr, poz, poz_real*2+1, val);
    }
}
int cauta(int st, int dr, int st_x, int dr_x, int poz_real){
    int mij=st+(dr-st)/2, x1, x2;
    if ((st==st_x)&&(dr==dr_x)) return a[poz_real];
    if (st_x<=mij) x1=cauta(st, mij, st_x, min(mij, dr_x), poz_real*2);
        else x1=-1;
    if (mij<dr_x)  x2=cauta(mij+1, dr, max(st_x, mij+1), dr_x, poz_real*2+1);
        else x2=-1;
    return max(x1, x2);
}
int main(){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d", &n, &m);
    for (i=1;i<=n;i++) {scanf("%d", &x); change(1, n, i, 1, x);}
    for (i=1;i<=m;i++) {
        scanf("%d%d%d", &op, &x, &y);
        if (op==0) printf("%d\n", cauta(1, n, x, y, 1));
            else change(1, n, x, 1, y);
    }
    return 0;
}