Cod sursa(job #526742)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 29 ianuarie 2011 12:39:01
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#define nmax 400009

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int N,M;
int MaxArb[nmax];

inline int maxim(int a,int b){if(a>b)return a;return b;}

void update(int nod,int l,int r,int p,int val)
{
    if(l==r)
    {
        MaxArb[nod]=val;
        return;
    }
    int m = (l+r)/2;
    if(p<=m)update(2*nod,l,m,p,val);
    else update(2*nod+1,m+1,r,p,val);
    MaxArb[nod]=maxim(MaxArb[2*nod],MaxArb[2*nod+1]);
}

int query(int nod,int l,int r,int a,int b)
{
    int m,t=-1;
    if(a<=l&&b>=r)
        t = MaxArb[nod];
    else
    {
        m=(l+r)/2;
        if(a<=m)
            t=query(2*nod,l,m,a,b);
        if(m<b)
            t=maxim(t,query(2*nod+1,m+1,r,a,b));
    }
    return t;
}

int main()
{
    int i,a,b;
    in>>N>>M;
    for(i=1;i<=N;i++)
        in>>a,update(1,1,N,i,a);
    while(M--)
    {
        in>>i>>a>>b;
        if(!i)
        {
            out<<query(1,1,N,a,b)<<'\n';
        }
        else
        {
            update(1,1,N,a,b);
        }
    }
    return 0;
}