Cod sursa(job #2110242)

Utilizator MaarcellKurt Godel Maarcell Data 20 ianuarie 2018 13:41:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
 
int N,M,segtree[400300],pos,ql,qr,val,MAX;
int maxim(int a, int b){
    if (a>b) return a;
    return b;
}
 
void update(int nod, int l, int r){
    if (l==r){
        segtree[nod]=val;
        return;
    }
 
    int mid=(l+r)/2;
    if (pos<=mid) update(2*nod,l,mid);
    else update(2*nod+1,mid+1,r);
    segtree[nod]= maxim(segtree[nod*2],segtree[nod*2+1]);
}
 
void query(int nod, int l, int r){
    if (ql<=l && r<=qr){
        if (MAX<segtree[nod]) MAX=segtree[nod];
        return;
    }
 
    int mid=(l+r)/2;
    if (ql<=mid) query(2*nod,l,mid);
    if (mid<qr) query(2*nod+1,mid+1,r);
}
int main(){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d\n",&N,&M);
 
    int i,A,B,type;
    for (i=1; i<=N; i++){
        scanf("%d",&val);
        pos=i;
        update(1,1,N);
    }
 
    for (i=1; i<=M; i++){
        scanf("%d %d %d\n",&type, &A, &B);
        if (type==0){
            MAX=0;
            ql=A, qr=B;
            query(1,1,N);
 
            printf("%d\n",MAX);
        }
        else{
            pos=A, val=B;
            update(1,1,N);
        }
    }
    return 0;
}