Cod sursa(job #1738750)

Utilizator proflaurianPanaete Adrian proflaurian Data 7 august 2016 16:42:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#define tip unsigned int
#define N 1<<18
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
inline tip prefix_zero(tip x),sufix_zero(tip x),poz_lsb(tip x),poz_msb(tip x),ord_lsb(tip x),
ord_msb(tip x),lsb(tip x),msb(tip x),left_son(tip x),right_son(tip x),dad(tip x),ask(tip st,tip dr),
is_right(tip x);
inline void upd(unsigned p,tip v);
tip n,m,k,i,x,a,b,c,aint[N];
int main()
{
    f>>n>>m;k=msb(n)<<1;
    for(a=1;a<=n;a++)
    {
        f>>b;
        upd(2*a-1,b);
    }
    for(;m;m--)
    {
        f>>c>>a>>b;
       if(c)upd(2*a-1,b);else g<<ask(2*a-2,2*b-1)<<'\n';
    }
    return 0;
}
inline tip prefix_zero(tip x){if(x==0)return -1;return __builtin_clz(x);}
inline tip sufix_zero(tip x){return __builtin_ctz(x);}
inline tip poz_lsb(tip x){return __builtin_ffs(x);}
inline tip poz_msb(tip x){return 32-__builtin_clz(x);}
inline tip ord_lsb(tip x){return poz_lsb(x)-1;}
inline tip ord_msb(tip x){return poz_msb(x)-1;}
inline tip lsb(tip x){return 1<<ord_lsb(x);}
inline tip msb(tip x){return 1<<ord_msb(x);}
inline tip is_right(tip x){return x&(lsb(x)<<1);}
inline tip left_son(tip x){return x-(lsb(x)>>1);}
inline tip right_son(tip x){return x+(lsb(x)>>1);}
inline tip dad(tip x){return is_right(x)?(x-lsb(x)):(x+lsb(x));}
inline void upd(tip p,tip v)
{
    aint[p]=v;
    for(p=dad(p);p!=k;p=dad(p))
        aint[p]=max(aint[left_son(p)],aint[right_son(p)]);
}
inline tip ask(tip st,tip dr)
{
    tip lo,hi,mi,z;
    if(dr==st+1)return aint[dr];
    z=1+sufix_zero(msb(st^dr));
    lo=(st>>z)<<z;
    hi=lo+(1<<z)-1;
    mi=(lo+hi+1)>>1;
    if(dr-st==hi-lo)return aint[mi];
    return max(ask(st,mi-1),ask(mi,dr));
}