Cod sursa(job #1360486)

Utilizator dumytruKana Banana dumytru Data 25 februarie 2015 15:29:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <iostream>
#define nmax 200000

using namespace std;

unsigned n,m,nr,arb[400002];

unsigned maxim(unsigned a, unsigned b)
{
    if(a>b)return a;
    return b;
}
void update(unsigned nod, unsigned st, unsigned dr,unsigned pos, unsigned val)
{
    if(st>=pos && dr<=pos)
    {
        arb[nod]=val;
    }
    else
    {
        unsigned mijl=(st+dr)>>1;
        if(pos<=mijl)
            update((nod<<1),st, mijl, pos, val);
        else
            update((nod<<1)+1,mijl+1, dr, pos, val);
        arb[nod] = maxim(arb[nod<<1],arb[(nod<<1)+1]);
    }
}

unsigned query(unsigned nod, unsigned st, unsigned dr,unsigned a,unsigned b)
{
    if(st>=a && dr<=b)
    {
        return arb[nod];
    }
    else
    {
        unsigned mijl=(st+dr)>>1;
        if(a<=mijl && b<=mijl)
            query(nod<<1,st, mijl, a, b);
        else if(a>mijl && b>mijl)
            query((nod<<1)+1,mijl+1,dr,a,b);
        else
            return maxim(query(nod<<1,st, mijl, a, mijl),query((nod<<1)+1,mijl+1, dr, mijl+1, b));
    }
}


int main()
{
    unsigned i,t,a,b;
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f>>n>>m;

    cout<< (4<<1);
    for(i=1;i<=n;i++)
    {
        f>>nr;
        update(1,1,n,i,nr);

    }
    for(i=1;i<=m;i++)
    {
        f>>t>>a>>b;
        if(t==0)g<<query(1,1,n,a,b)<<'\n';
        else update(1,1,n,a,b);
    }
    return 0;
}