Cod sursa(job #2122474)

Utilizator mateibanuBanu Matei Costin mateibanu Data 5 februarie 2018 10:08:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <bits/stdc++.h>

using namespace std;

int ai[200010];
int n,m;

void build(){
    int i;
    for (i=n;i<2*n;i++){
        scanf("%d",&ai[i]);
    }
    for (i=n-1;i>0;i--){
        ai[i]=max(ai[i<<1],ai[i<<1|1]);
    }
}

void update(int p, int x){
    int i;
    ai[p+n-1]=x;
    for (i=(p+n-1)>>1;i>0;i>>=1){
        ai[i]=max(ai[i<<1],ai[i<<1|1]);
    }
}

int query(int a, int b){
    int r=0;
    for (a+=n-1,b+=n;a<b;a>>=1,b>>=1){
        if (a&1) r=max(r,ai[a++]);
        if (b&1) r=max(r,ai[--b]);
    }
    return r;
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    int q,x,y;
    scanf("%d%d",&n,&m);
    build();
    for (int i=1;i<=m;i++){
        scanf("%d%d%d",&q,&x,&y);
        if (!q) printf("%d\n",query(x,y));
        else update(x,y);
    }
    return 0;
}