Pagini recente » Cod sursa (job #536200) | Cod sursa (job #382812) | Cod sursa (job #53106) | Cod sursa (job #1444528) | Cod sursa (job #950767)
Cod sursa(job #950767)
#include <fstream>
using namespace std;
#define marime 262144
#define marime_v 100002
struct nod
{
int st,dr,max;
}arbore[marime];
int maxim(int x,int y)
{
if(x>y)
return x;
return y;
}
int v[marime_v];
void build(int st,int dr,int poz)
{
arbore[poz].st=st;
arbore[poz].dr=dr;
if(st==dr)
{
arbore[poz].max=v[st];
}
else
{
int mijl=(st+dr)>>1;
build(st,mijl,poz<<1);
build(mijl+1,dr,(poz<<1)+1);
arbore[poz].max=maxim(arbore[poz<<1].max,arbore[(poz<<1)+1].max);
}
}
int query(int st,int dr,int poz)
{
if(arbore[poz].st==st && arbore[poz].dr==dr)
return arbore[poz].max;
else
{
int mijl=(arbore[poz].st+arbore[poz].dr)>>1;
if(st>mijl)
return query(st,dr,(poz<<1)+1);
else if(dr<=mijl)
return query(st,dr,poz<<1);
else
return maxim(query(st,mijl,poz<<1),query(mijl+1,dr,(poz<<1)+1));
}
}
void update(int unde,int val,int poz)
{
if(arbore[poz].st==arbore[poz].dr && arbore[poz].st==unde)
v[unde]=val,arbore[poz].max=v[unde];
else
{
int mijl=(arbore[poz].st+arbore[poz].dr)>>1;
if(unde<=mijl)
update(unde,val,poz<<1);
else
update(unde,val,(poz<<1)+1);
arbore[poz].max=maxim(arbore[poz<<1].max,arbore[(poz<<1)+1].max);
}
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n,m,i;
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>v[i];
build(1,n,1);
int cod,a,b;
for(i=0;i<m;i++)
{
cin>>cod>>a>>b;
if(cod==0)
cout<<query(a,b,1)<<'\n';
else
update(a,b,1);
}
cin.close();
cout.close();
//system("PAUSE");
return 0;
}