Cod sursa(job #1861771)

Utilizator roxanastRoxana Stiuca roxanast Data 29 ianuarie 2017 11:54:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#define NMAX 100010
using namespace std;
int MaxArb[4*NMAX],n,m,start,finish,maxim,ind,val;
ifstream f("arbint.in");
ofstream g("arbint.out");
void read(int nod,int right,int left){
    if(right==left)
        f>>MaxArb[nod];
    else{
        int mij=(left+right)/2;
        read(2*nod, right, mij);
        read(2*nod+1, mij+1,left);
        MaxArb[nod]=max(MaxArb[2*nod],MaxArb[2*nod+1]);
    }
}
void Update(int nod,int left,int right){
    if(left==right)
        MaxArb[nod]=val;
    else{
        int mij=(left+right)/2;
        if(ind<=mij)
            Update(2*nod,left,mij);
        if(ind>mij)
            Update(2*nod+1,mij+1,right);
        MaxArb[nod]=max(MaxArb[2*nod],MaxArb[2*nod+1]);
    }
}
void Query(int nod,int left,int right){
    if(start<=left&&right<=finish)
        maxim=max(maxim,MaxArb[nod]);
    else{
        int mij=(left+right)/2;
        if(start<=mij)
            Query(2*nod,left,mij);
        if(mij<finish)
            Query(2*nod+1,mij+1,right);
    }
}
int main()
{
    f>>n>>m;
    read(1,1,n);
    for(int ii=1;ii<=m;ii++){
        int op,x,y;
        f>>op>>x>>y;
        if(op==0){
            maxim=0;
            start=x;
            finish=y;
            Query(1,1,n);
            g<<maxim<<'\n';
        }else{
            ind=x;
            val=y;
            Update(1,1,n);
        }
    }
    return 0;
}