Cod sursa(job #1750377)

Utilizator giotoPopescu Ioan gioto Data 29 august 2016 23:38:29
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int n,m,a,b,op,pos,x,st1,dr1,maxim,Max[400088];
void update(int nod,int st,int dr){
    if(st==dr){Max[nod]=x;return;}
    int mid=(st+dr)/2;
    if(pos<=mid) update(nod*2,st,mid);
            else update(nod*2+1,mid+1,dr);
    Max[nod]=max(Max[2*nod],Max[2*nod+1]);
}
void query(int nod,int st,int dr){
    if(st1<=st&&dr<=dr1){maxim=max(maxim,Max[nod]);return;}
    int mid=(st+dr)/2;
    if(st1<=mid) query(2*nod,st1,mid);
    if(mid<dr1) query(2*nod+1,mid+1,dr1);
}
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,1,n);
    }
    for(int i=1;i<=m;++i){
        scanf("%d%d%d", &op,&a, &b);
        if(op==0){
            maxim=-1;
            st1=a;dr1=b;
            query(1,1,n);
            printf("%d\n",maxim);
        }else {pos=a;x=b;update(1,1,n);}
    }
    return 0;
}