Pagini recente » Cod sursa (job #666632) | Cod sursa (job #24634) | Cod sursa (job #2478651) | Cod sursa (job #361110) | Cod sursa (job #2365315)
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int N=1<<17;
const int INF=1<<30;
int n,m,v[N],aint[8*N];
void update(int poz,int val)
{
poz=n+poz-1;
aint[poz]=val;
while(poz>1)
{
poz=poz/2;
aint[poz]=max(aint[2*poz],aint[2*poz+1]);
}
}
int query(int ind,int stq,int drq,int sti,int dri)
{
if(sti>=stq && dri<=drq)
return aint[ind];
else
{
int x=-INF,y=-INF;
int m=(sti+dri)/2;
if(stq<=m)
x=query(2*ind,stq,drq,sti,m);
if(drq>m)
y=query(2*ind+1,stq,drq,m+1,dri);
return max(x,y);
}
}
int main()
{
in>>n>>m;
int t,y,x=0;
while((1<<x)<n)
x++;
for(int i=1;i<=n;i++)
in>>v[i];
for(int i=n+1;i<=(1<<x);i++)
v[i]=-INF;
n=1<<x;
for(int i=1;i<=n;i++)
aint[n+i-1]=v[i];
for(int i=n-1;i>=1;i--)
aint[i]=max(aint[2*i],aint[2*i+1]);
for(int i=1;i<=m;i++)
{
in>>t>>x>>y;
if(t==0)
out<<query(1,x,y,1,n)<<'\n';
else
update(x,y);
}
return 0;
}