Pagini recente » Cod sursa (job #2982208) | Cod sursa (job #2816423) | Cod sursa (job #1641739) | Cod sursa (job #1499336) | Cod sursa (job #245363)
Cod sursa(job #245363)
#include<stdio.h>
#define N 1000000
struct nod{ int s,d,m; } arb[2*N];
int fr[N],nr,p;
void build(int n)
{
if(arb[n].s==arb[n].d)
{
scanf("%d",&arb[n].m);
++p;
fr[p]=n;
return;
}
arb[2*n].s=arb[n].s;
arb[2*n].d=(arb[n].s+arb[n].d)/2;
arb[2*n+1].s=arb[2*n].d+1;
arb[2*n+1].d=arb[n].d;
build(2*n);
build(2*n+1);
arb[n].m=arb[2*n].m>arb[2*n+1].m?arb[2*n].m:arb[2*n+1].m;
}
int query(int s,int d,int n)
{
if(s==arb[n].s&&d==arb[n].d)
return arb[n].m;
int ms=-1,md=-1;
if(s<=arb[2*n].d)
ms=query(s,arb[2*n].d<d?arb[2*n].d:d,2*n);
if(d>=arb[2*n+1].s)
md=query(arb[2*n+1].s>s?arb[2*n+1].s:s,d,2*n+1);
return ms>md?ms:md;
}
void update(int poz, int val)
{
int ok=1, n=fr[poz]/2, max;
arb[fr[poz]].m=val;
do
{
max=arb[2*n].m>arb[2*n+1].m?arb[2*n].m:arb[2*n+1].m;
if(max!=arb[n].m) { arb[n].m=max; n/=2; }
else ok=0;
}while(n&&ok);
}
int main()
{
int m,a,b,op;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&nr,&m);
arb[1].s=1;
arb[1].d=nr;
build(1);
for(int i=0;i<m;++i)
{
scanf("%d%d%d",&op,&a,&b);
if(op==0) printf("%d\n",query(a,b,1));
else update(a,b);
}
return 0;
}