Cod sursa(job #1916990)

Utilizator VicktorVictor Teodor Stoian Vicktor Data 9 martie 2017 10:51:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <cstdio>
#define NMAX 100001
using namespace std;

ofstream cout("arbint.out");

int n,m,a,b,MAX,i,x,caz;
int arb[4*NMAX+20];

inline void Update(int nod, int s, int d){
    int mijl;
    if(s==d)
        arb[nod]=b;
    else{
        mijl=(s+d)>>1;
        if(a<=mijl)
            Update(nod*2,s,mijl);
        else
            Update(nod*2+1,mijl+1,d);
            arb[nod]=max(arb[nod*2],arb[nod*2+1]);
    }
}

inline void query(int nod, int s, int d){
    int mijl;
    if(a<=s && b>=d){
        if(MAX<arb[nod])
            MAX=arb[nod];
            return;
    }
    else{ mijl=(s+d)>>1;
        if(mijl>=a)
            query(2*nod,s,mijl);
        if(mijl<b)
            query(2*nod+1,mijl+1,d);
        }
}

int main()
{
    FILE*fin=freopen("arbint.in","r",stdin);
    scanf("%d%d",&n,&m);

    for(i=1;i<=n;++i){
        scanf("%d",&x);
        a=i;b=x;
        Update(1,1,n);
    }

    for(i=1;i<=m;++i){
        scanf("%d%d%d",&caz,&a,&b);
              MAX=0;
        if(caz==0){
            query(1,1,n);
            cout<<MAX<<'\n';
        }
        else
            Update(1,1,n);
    }

    return 0;
}