Pagini recente » Cod sursa (job #2616743) | Cod sursa (job #589416) | Cod sursa (job #3286554) | Cod sursa (job #1595249) | Cod sursa (job #3200324)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n,m,sqrn;
vector < int > v,batog;
void update(int ind, int aux)
{
v[ind]=aux;
int l=(ind/sqrn)*sqrn,bucket=ind/sqrn;
int r=l+sqrn;
batog[bucket]=0;
while(l<r){
batog[bucket]=max(batog[bucket],v[l++]);
}
}
int getmax(int l , int r)
{
int ans=0;
int nextbuck,prevbuck;
nextbuck=((l/sqrn)+1)*sqrn;
prevbuck=(r/sqrn)*sqrn-1;
//cout<<l<<" "<<r<<" ";
while(l<=r && l<nextbuck)
ans=max(ans,v[l++]);
while(r>=l && r>prevbuck)
ans=max(ans,v[r--]);
int st=nextbuck/sqrn,dr=prevbuck/sqrn;
while(st<=dr)
ans=max(ans,batog[st++]);
return ans;
}
int main()
{
int n,q;
cin>>n>>q;
sqrn=(int)sqrt(n);
batog.resize(sqrn+5);
v.resize(n);
for(int i=0;i<n;i++)
{
cin>>v[i];
int aux=i/sqrn;
batog[aux]=max(batog[aux],v[i]);
}
bool tip;
int a1,a2;
while(q--)
{
cin>>tip>>a1>>a2;
if(tip)
update(a1-1,a2);
else
cout<<getmax(a1-1,a2-1)<<'\n';
}
return 0;
}