Cod sursa(job #1410053)

Utilizator httpsLup Vasile https Data 30 martie 2015 20:29:38
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

#ifdef INFOARENA
ifstream f("strmatch.in");
#define cout g
#else
ifstream f("date.in");
#endif // INFOARENA

ofstream g("strmatch.out");

#define nmax 100001

int aint[nmax*4];
int n,m,tip,a,b;

void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        f>>aint[nod];
        return;
    }

    int mid=(st+dr)>>1;
    int left=nod<<1,right=nod<<1|1;

    build(left,st,mid);
    build(right,mid+1,dr);

    aint[nod]=max(aint[left],aint[right]);
}

void update(int nod,int st,int dr,int pos,int val)
{
    if(st==dr)
    {
        aint[nod]=val;
        return;
    }

    int mid=(st+dr)>>1;
    int left=nod<<1,right=nod<<1|1;

    if(pos<=mid) update(left,st,mid,pos,val);
    else update(right,mid+1,dr,pos,val);

    aint[nod]=max(aint[left],aint[right]);

}

int query(int nod,int st,int dr,int x,int y)
{
    if(x<=st && dr<=y) return aint[nod];

    int mid=(st+dr)>>1;
    int left=nod<<1,right=nod<<1|1;

    if(y<=mid) return query(left,st,mid,x,y);
    else if(x>mid) return query(right,mid+1,dr,x,y);
        else return max(query(left,st,mid,x,y),query(right,mid+1,dr,x,y));

}

int main()
{
    f>>n>>m;
    build(1,1,n);
    for(;m;--m)
    {
        f>>tip>>a>>b;
        if(tip==0) cout<<query(1,1,n,a,b)<<'\n';
        else update(1,1,n,a,b);
    }
}