Cod sursa(job #1919420)

Utilizator xkz01X.K.Z. xkz01 Data 9 martie 2017 19:21:50
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<cstdio>
using namespace std;
int a[200005], i, n, m, x, y, sol, q;
inline int max(int a, int b){if (a>=b) return a; else return b;}
inline void update(int poz){
    while (poz>1) {
        poz/=2;
        a[poz]=max(a[2*poz], a[2*poz+1]);
    }
}
inline void place(int st, int dr, int poz_real){
    int mij=st+(dr-st)/2;
    if (st==dr) {a[poz_real]=y; update(poz_real); return;}
    if (x<=mij) place(st, mij, poz_real*2);
        else place(mij+1, dr, poz_real*2+1);
}
void get_max(int st, int dr, int poz_real){
    int mij=st+(dr-st)/2;
    ///maximul in intervalul [x,y]
    if ((x<=st)&&(dr<=y)) {if (a[poz_real]>sol) sol=a[poz_real]; return;}
    if (x<=mij) get_max(st, mij, poz_real*2);
    if (mij<y) get_max(mij+1, dr, poz_real*2+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", &y); x=i; place(1,n,1);}
    for (i=1;i<=m;i++) {
        scanf("%d%d%d", &q, &x, &y);
        if (q==1) place (1,n,1);
            else {sol=-1; get_max(1,n,1); printf("%d\n", sol);}
    }
    return 0;
}