Pagini recente » Cod sursa (job #2224865) | Cod sursa (job #1332166) | Cod sursa (job #1525156) | Cod sursa (job #2877229) | Cod sursa (job #270190)
Cod sursa(job #270190)
// solutie O((m+n)*sqrt(n))
#include<stdio.h>
#include<cmath>
#include<string>
using namespace std;
FILE*fin=fopen("ai.in","r");
FILE*fout=fopen("ai.out","w");
#define nm 100005
int n,m,a[nm],dim,k,aa[1000];
inline void update(int x,int y)
{
int bloc,st,dr,i,max=0;
if(x%k) bloc=x/k+1;
else bloc=x/k;
a[x]=y;
st=(bloc-1)*k+1;
dr=bloc*k;
if(bloc==dim) dr=n;
for(i=st;i<=dr;i++)
if(a[i]>max) max=a[i];
aa[bloc]=max;
}
int query(int x,int y)
{
int blocx,blocy,ans=0,i,st,dr;
if(x%k) blocx=x/k+1;
else blocx=x/k;
if(y%k) blocy=y/k+1;
else blocy=y/k;
for(i=blocx+1;i<blocy;i++)
if(aa[i]>ans) ans=aa[i];
if(blocx==blocy)
{
for(i=x;i<=y;i++)
if(a[i]>ans) ans=a[i];
}
else
{
st=x;
dr=blocx*k;
if(blocx==dim) dr=n;
for(i=st;i<=dr;i++)
if(a[i]>ans) ans=a[i];
st=(blocy-1)*k+1;
dr=y;
for(i=st;i<=dr;i++)
if(a[i]>ans) ans=a[i];
}
return ans;
}
int main()
{
int x,y,i,o;
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=n;i++)
fscanf(fin,"%d",&a[i]);
k=(int)sqrt(n);
if(n-k*k) dim=k+1;
else dim=k;
memset(aa,0,sizeof(aa));
for(i=1;i<=n;i++)
update(i,a[i]);
for(i=1;i<=m;i++)
{
fscanf(fin,"%d%d%d",&o,&x,&y);
if(o) update(x,y);
else fprintf(fout,"%d\n",query(x,y));
}
fclose(fin);
fclose(fout);
return 0;
}