Pagini recente » Cod sursa (job #3319351) | Cod sursa (job #1767731) | Cod sursa (job #3323838) | Cod sursa (job #2204894) | Cod sursa (job #3331603)
#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int nmax=1e5+5;
const int bsize=320;
int n,q,a[nmax];
int bs,nb,buck_max[bsize];
struct sqrt_decomp
{
void init_buckets()
{
bs=max(1,(int)sqrt(n+1));
nb=n/bs+1;
for (int b=0; b<nb; b++ )
rebuild(b);
}
void rebuild(int b)
{
int st=b*bs+1;
int dr=min((b+1)*bs,n);
int mx=INT_MIN;
for (int i=st; i<=dr; i++ )
if ( a[i]>mx )
mx=a[i];
buck_max[b]=mx;
}
void update(int poz, int val)
{
int b=(poz-1)/bs;
int st=b*bs+1;
int dr=min((b+1)*bs,n);
a[poz]=val;
rebuild(b);
}
int get_max(int x, int y)
{
int mx=INT_MIN;
int bl=(x-1)/bs;
int br=(y-1)/bs;
if ( bl==br )
{
for (int i=x; i<=y; i++ )
mx=max(mx,a[i]);
return mx;
}
int dr=min((bl+1)*bs,n);
for (int i=x; i<=dr; i++ )
mx=max(mx,a[i]);
for (int i=bl+1; i<=br-1; i++ )
mx=max(mx,buck_max[i]);
int st=br*bs+1;
for (int i=st; i<=y; i++ )
mx=max(mx,a[i]);
return mx;
}
}batog;
int main()
{
f >> n >> q;
for (int i=1; i<=n; i++ )
f >> a[i];
batog.init_buckets();
while ( q-- )
{
int c,x,y; f >> c >> x >> y;
if ( c==0 ) g << batog.get_max(x,y) << '\n';
else batog.update(x,y);
}
return 0;
}