Cod sursa(job #897212)
#include <iostream>
#include <fstream>
#define NMAX 100010
using namespace std;
int arb[4*NMAX+66];
int n,m,poz,val,start,finish,maxim;
void insert(int nod,int left,int right)
{
if(left==right)
{
arb[nod]=val;
return;
}
int div=(left+right)/2;
if(poz<=div) insert(2*nod,left,div);
else insert(2*nod+1,div+1,right);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
void query(int nod,int left,int right)
{
if(start <= left && right <= finish)
{
if(maxim<arb[nod]) maxim=arb[nod];
return;
}
int div=left+(right-left)/2;
if(start <= div) query(2*nod, left, div);
if(finish > div) query(2*nod+1, div+1, right);
}
int main()
{
ifstream fin("arbint.in");
ofstream fout("arbint.out");
fin>>n>>m;
int tip,x,y;
for(int i=1;i<=n;i++)
{
fin>>x;
poz=i;val=x;
insert(1,1,n);
}
for(int i=1;i<=m;i++)
{
fin>>tip>>x>>y;
if(tip==0)
{
maxim=-1;
start=x;finish=y;
query(1,1,n);
fout<<maxim<<'\n';
}
else
{
poz=x;val=y;
insert(1,1,n);
}
}
return 0;
}