Cod sursa(job #1675881)

Utilizator adiXMGemene Adrian adiXM Data 5 aprilie 2016 16:59:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int NMAX=270005;
int a[NMAX];
int n,m;
inline int Query(int nod,int x,int y,int st,int dr)
{
    if(st==x && dr==y)
        return a[nod];
    int m=(st+dr)/2;
    if(y<=m)
        return Query(2*nod,x,y,st,m);
    if(m+1<=x)
        return Query(2*nod+1,x,y,m+1,dr);
    return max(Query(2*nod,x,m,st,m),Query(2*nod+1,m+1,y,m+1,dr));
}
inline void Update(int p,int x)
{
    p=p+n-1;
    a[p]=x;
    while(p>0)
    {
        int t=p/2;
        int mx=max(a[2*t],a[2*t+1]);
        a[t]=mx;
        p=t;
    }
}
int main()
{
    int x,y,op;
    f>>n>>m;
    int N=1;
    while(N<n)
        N*=2;
    int j=N,val;
    for(int i=1;i<=n;i++)
    {
        f>>val;
        a[j++]=val;
    }
    n=N;
    for(int i=n-1;i>=1;i--)
        a[i]=max(a[2*i],a[2*i+1]);
    for(int i=1;i<=m;i++)
    {
        f>>op>>x>>y;
        if(op==1)
            Update(x,y);
        else
            g<<Query(1,x,y,1,n)<<"\n";
    }
    return 0;
}