Pagini recente » Cod sursa (job #2286198) | Cod sursa (job #1606038) | Cod sursa (job #2681911) | Cod sursa (job #2099457) | Cod sursa (job #968348)
Cod sursa(job #968348)
#include <cstdio>
FILE *f=fopen("arbint.in","r"),*g=fopen("arbint.out","w");
int n,m,st[400],dr[400],mx[400],a[100005],buc[100005],k;
void Read(); void Solve(); void Update(int x); void Query(int x,int y);
void Read()
{ int i,j,max1=0;
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=n;i++) fscanf(f,"%d",&a[i]);
k=1;
while(k*k<=n) k++;
k--;
for(i=1;i<=k;i++)
{st[i]=dr[i-1]+1; dr[i]=st[i]+k-1;
max1=-1;
for(j=st[i];j<=dr[i];j++)
{if (a[j]>max1) max1=a[j];
buc[j]=i;
}
mx[i]=max1;
// cout<<st[i]<<" "<<dr[i]<<" "<<mx[i]<<"\n";
}
}
void Solve()
{ int i,t,b,e;
for(i=1;i<=m;i++)
{ fscanf(f,"%d",&t);
if (!t) {fscanf(f,"%d %d",&b,&e); Query(b,e); }
else {fscanf(f,"%d %d",&b,&e); a[b]=e; Update(b); }
}
}
void Update(int x)
{ int i,v,max2;
v=buc[x];
if (!buc[x]) return;
max2=-1;
for(i=st[v];i<=dr[v];i++)
if (a[i]>max2) max2=a[i];
mx[v]=max2;
}
void Query(int x,int y)
{ int max3=-1,i,mnv=y,mxv=x;
//cout<<mx[2]<<" "<<y<<" "<<st[buc[y]]<<" "<<dr[buc[y]]<<"\n";
for(i=1;i<=k;i++)
if (x<=st[i] && dr[i]<=y)
{ if (mx[i]>max3) max3=mx[i];
if (st[i]<mnv) mnv=st[i];
if (dr[i]>mxv) mxv=dr[i];
}
for(i=x;i<=mnv;i++) if (a[i]>max3) max3=a[i];
for(i=mxv;i<=y;i++) if (a[i]>max3) max3=a[i];
fprintf(g,"%d\n",max3);
}
int main()
{ Read();
Solve();
return 0;
}