Cod sursa(job #1750657)

Utilizator giotoPopescu Ioan gioto Data 30 august 2016 18:01:15
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
#define max(a,b) (a>b)?a:b
using namespace std;

int val,n,a,b,m,x,pos,maxim,Max[400088];
void update(int st,int dr,int nod){
    if(st==dr){Max[nod]=x;return;}
    int div=(st+dr)/2;
    if(pos<=div) update(st,div,2*nod);
    else         update(div+1,dr,2*nod+1);
    Max[nod]=max(Max[2*nod],Max[2*nod+1]);
}
void query(int st,int dr,int nod){
    if(a<=st&&dr<=b){
        if(maxim<Max[nod]) maxim=Max[nod];
        return;
    }
//    else{
    int div=(st+dr)/2;
    if(a<=div)query(st,div,2*nod);
    if(div<b)query(div+1,dr,2*nod+1);
//    }
}
int main()
{
    freopen("arbint.in", "r",stdin);
    freopen("arbint.out", "w",stdout);
    scanf("%d%d", &n,&m);
    for(int i=1;i<=n;++i){
        scanf("%d",&x);
        pos=i;update(1,n,1);
    }
    for(int i=1;i<=m;++i){
        scanf("%d%d%d", &val, &a, &b);
        if(val==0){
            maxim=-1;
            query(1,n,1);
            printf("%d\n", maxim);
        }else{
            x=b;pos=a;
            update(1,n,1);
        }
    }
    return 0;
}