Cod sursa(job #1856454)

Utilizator xkz01X.K.Z. xkz01 Data 24 ianuarie 2017 21:41:58
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<cstdio>
using namespace std;
int i, x, y, n, m, q, a[100001], mx;
inline int max(int a, int b){if (a>=b) return a; else return b;}
inline void update(int poz_real){
    while (poz_real>0) {
        a[poz_real]=max(a[2*poz_real], a[2*poz_real+1]);
        poz_real/=2;
    }
}
inline void place(int val, int poz_cautat){
    int st=1, dr=n, mij, poz_real=1;
    while (st<dr) {
        mij=st+(dr-st)/2;
        if (poz_cautat<=mij) {st=mij+1; poz_real=poz_real*2;}
            else {dr=mij-1; poz_real=2*poz_real+1;}
    }
    a[poz_real]=x; update(poz_real/2);
}
inline void cauta(int st, int dr, int poz_real){
    int mij=st+(dr-st)/2;
    if ((x<=st)&&(dr<=y)) {if (a[poz_real]>mx) mx=a[poz_real]; return;}
    if (x<=mij) cauta(x, mij, 2*poz_real);
    if (mij< y) cauta(mij, x, 2*poz_real+1);
}
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); place(x, i);}
    for (i=1;i<=m;i++) {
        scanf("%d%d%d", &q, &x, &y); mx=-1;
        if (q==1) place(y, x);
        else if (q==0) {cauta(x, y, 1); printf("%d\n", mx);}
    }
    return 0;
}