Cod sursa(job #599952)

Utilizator andrianAndrian andrian Data 30 iunie 2011 09:30:55
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
#define nmax 100001

using namespace std;

int m,n,pos,val,start,finish;
long a[4*nmax+66], maxim;
#define a (a-1)

void update(int nod, int left, int right){
    if(left == right){
        a[nod] = val;
        return;
    }
    int div=(left+right)/2;
    if(pos <= div) update(2*nod, left, div);
    else           update(2*nod+1, div+1,right);
    a[nod] = (a[2*nod] > a[2*nod+1])?a[2*nod]:a[2*nod+1];
}

void query(int nod,int left, int right){
    if(start<=left && right<=finish){
        if(maxim < a[nod]) maxim = a[nod];
        return;
    }
    int div=(left+right)/2;
    if(left <= div) query(2*nod, left, div);
    if(div < right) query(2*nod+1, div+1, right);
}

int main()
{
    int x,y,z;
    ifstream in("arbint.in");
    ofstream out("arbint.out");
    in >> n >> m;
    for(int i=1;i<=n;++i){
        pos=i, in >> val;
        update(1,1,n);
    }
    for(int i=1;i<=m;++i){
        in >> x >> y >> z;
        if(x == 0){
            maxim =-1;
            start=y;
            finish=z;
            query(1,1,n);
            out << maxim;
        }else{
            pos=y;
            val=z;
            update(1,1,n);
        }
    }
    in.close();
    out.close();
    return 0;
}