Pagini recente » Cod sursa (job #1100613) | Cod sursa (job #2791138) | Cod sursa (job #1211130) | Cod sursa (job #2438436) | Cod sursa (job #2059354)
#include <bits/stdc++.h>
#define NRMARE INT_MAX
using namespace std;
vector<int> v;
int n,Max[1000],radical,m,t,a,b;
ifstream f("arbint.in");
ofstream g("arbint.out");
void impartire_siruri()
{
radical=sqrt(n);
int i;
for(i=0; i<n; ++i)
if(Max[i/radical]<v[i])
Max[i/radical]=v[i];
}
int determina_interval(int x)
{
return x/radical;
}
int query(int a,int b)
{
int i1=determina_interval(a-1),i2=determina_interval(b-1);
int Max_querry=0;int i,inceput=max(i2*radical,a-1);
for(i=a-1;i<(int)(i1+1)*radical && i<b;++i)
if(v[i]>Max_querry) Max_querry=v[i];
for(i=inceput;i<b;++i)
if(v[i]>Max_querry) Max_querry=v[i];
for(i=i1+1;i<i2;++i)
if(Max[i]>Max_querry) Max_querry=Max[i];
return Max_querry;
}
void update(int a,int b)
{
int interval=determina_interval(a-1);
v[a-1]=b;
Max[interval]=0;
int i;
for(i=(int)interval*radical;i<(int)(interval+1)*radical;++i)
if(v[i]>Max[interval]) Max[interval]=v[i];
}
int main()
{
int i;
f>>n>>m;
v.resize(n);
for(i=0; i<n; ++i)
f>>v[i];
impartire_siruri();
for(i=0;i<m;++i)
{
f>>t>>a>>b;
if(!t) g<<query(a,b)<<'\n';
else update(a,b);
}
return 0;
}