Pagini recente » Istoria paginii runda/runda_ezoterica_1 | Cod sursa (job #1590385) | Cod sursa (job #451770) | Cod sursa (job #1992811) | Cod sursa (job #539934)
Cod sursa(job #539934)
#include <fstream>
using namespace std;
const char InFile[]="arbint.in";
const char OutFile[]="arbint.out";
const int aint_SIZE=1<<18;
ifstream fin(InFile);
ofstream fout(OutFile);
int N,M,aint[aint_SIZE],x,op,a,b;
int update_pos,update_val,query_st,query_dr;
inline int father(const int &nod)
{
return nod>>1;
}
inline int left(const int &nod)
{
return nod<<1;
}
inline int right(const int &nod)
{
return (nod<<1)+1;
}
void update_aint(int st, int dr, int nod)
{
if(st>dr)
{
return;
}
if(st==dr)
{
aint[nod]=update_val;
return;
}
int l=left(nod);
int r=right(nod);
int m=st+((dr-st)>>1);
if(update_pos<=m)
{
update_aint(st,m,l);
}
else
{
update_aint(m+1,dr,r);
}
aint[nod]=max(aint[l],aint[r]);
}
inline void update(int i, int x)
{
update_pos=i;
update_val=x;
update_aint(1,N,1);
}
int query_aint(int st,int dr,int nod)
{
if(query_st<=st && dr<=query_dr)
{
return aint[nod];
}
int l=left(nod);
int r=right(nod);
int m=st+((dr-st)>>1);
int lv=0,rv=0;
if(query_st<=m)
{
lv=query_aint(st,m,l);
}
if(query_dr>m)
{
rv=query_aint(m+1,dr,r);
}
return max(lv,rv);
}
inline int query(const int &st, const int &dr)
{
query_st=st;
query_dr=dr;
return query_aint(1,N,1);
}
int main()
{
fin>>N>>M;
for(register int i=1;i<=N;++i)
{
fin>>x;
update(i,x);
}
for(register int i=1;i<=M;++i)
{
fin>>op>>a>>b;
if(op==1)
{
update(a,b);
}
else
{
fout<<query(a,b)<<"\n";
}
}
fin.close();
fout.close();
return 0;
}