Pagini recente » Cod sursa (job #2256746) | Cod sursa (job #1492553) | Cod sursa (job #1819946) | Arhiva de probleme | Cod sursa (job #1738750)
#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));
}