Cod sursa(job #1594963)

Utilizator AlexandruRudiAlexandru Rudi AlexandruRudi Data 9 februarie 2016 20:49:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
# include <bits/stdc++.h>
using namespace std;
long long arb[400005];
int m,n,c,a,b,pos,val,maxim;
void Update(int nod,int left,int right);
void Query(int nod,int left,int right);
int main(void)
{
    ifstream in("arbint.in");
    ofstream out("arbint.out");
    in >> n >> m;
    for(int i=1;i<=n;i++){
        in >> c;
        val=c, pos=i;
        Update(1,1,n);
    }
    for(int i=1;i<=m;i++){
        in >> c >> a >> b;
        if(c==0){
            maxim=-1;
            Query(1,1,n);
            out << maxim << '\n';
        }
        else{
            val=b,pos=a;
            Update(1,1,n);
        }
    }
}
void Update(int nod,int left,int right)
{
    if(left==right){
        arb[nod]=val;
        return;
    }
    int div=(left+right)/2;
    if(pos<=div) Update(2*nod,left,div);
    else Update(2*nod+1,div+1,right);
    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
void Query(int nod,int left, int right){
    if(a <= left && right <= b){
        if(arb[nod]>maxim) maxim=arb[nod];
        return;
    }
    int div=(left+right)/2;
    if(a <= div) Query(2*nod,left,div);
    if(div < b) Query(2*nod+1,div+1,right);
}