Cod sursa(job #2095399)

Utilizator biaiftimeIftime Bianca biaiftime Data 27 decembrie 2017 15:11:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#define Nmax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[4*Nmax],a[Nmax],n,m;
void Read()
{
    int i;
    fin>>n>>m;
    for(i=1;i<=n;++i)
    fin>>a[i];
}
int Build(int l,int r,int nod)
{
    if(r==l){
        arb[nod]=a[l];
        return arb[nod];
    }
    int val1,val2,mid;
    mid=l+(r-l)/2;
    val1=Build(l,mid,2*nod);
    val2=Build(mid+1,r,2*nod+1);
    arb[nod]=max(val1,val2);
    return arb[nod];
}
void Update(int l,int r,int nod,int i,int val)
{
    if(r==l){ a[l]=val; arb[nod]=val; return;}
    int mid=l+(r-l)/2;
    if(i<=mid) Update(l,mid,2*nod,i,val);
    else Update(mid+1,r,2*nod+1,i,val);
    arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
int Query(int l,int r,int nod,int st,int dr)
{
    if(l>=st&&r<=dr)return arb[nod];
    if(l>dr||r<st)return 0;
    int mid=l+(r-l)/2;
    int val1=Query(l,mid,2*nod,st,dr);
    int val2=Query(mid+1,r,2*nod+1,st,dr);
    return max(val1,val2);
}
int main()
{
    Read();
    Build(1,n,1);
    int i,cod,x,y;
    /*for(i=1;i<=4*n;i++)fout<<arb[i]<<" ";
    fout<<"\n";*/
    for(i=1;i<=m;i++)
    {
        fin>>cod>>x>>y;
        if(cod==0)fout<<Query(1,n,1,x,y)<<"\n";
        else Update(1,n,1,x,y);
    }
    return 0;
}