Pagini recente » Cod sursa (job #1751113) | Cod sursa (job #2190817) | Cod sursa (job #1790565) | Cod sursa (job #532915) | Cod sursa (job #2988797)
#include <iostream>
#include <fstream>
#include <math.h>
#define NMAX 100000
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, v[NMAX], sq, batog_size, batog[317], interval;
void build_batog(){
for(int i=0;i<n;i++){
int j=i/sq;
batog[j]=std::max(batog[j], v[i]);
}
}
int query(int left, int right){
int firstInterval = (left + sq - 1) / sq * sq;
int lastInterval = right / sq * sq;
int el_max=0;
cout<<firstInterval<<" "<<lastInterval<<"\n";
while(left<right&&left<firstInterval)
el_max=std::max(el_max, v[left++]);
while(right>=left&&right>=lastInterval)
el_max=std::max(el_max, v[right--]);
firstInterval/=sq;
lastInterval/=sq;
while(firstInterval<lastInterval)
el_max=std::max(el_max, batog[firstInterval++]);
return el_max;
}
int main()
{
fin>>n>>m;
sq=sqrt(n);
batog_size=(n+sq-1)/sq;
for(int i=0;i<n;i++){
fin>>v[i];
}
build_batog();
int operatie, e1, e2;
for(int i=0;i<m;i++){
fin>>operatie>>e1>>e2;
e1--;
e2--;
if(!operatie)
fout<<query(e1, e2)<<"\n";
else{
v[e1]=e2;
interval=e1/sq;
int left=interval*sq;
int right=(interval+1)*sq-1;
batog[interval]=0;
while(right<=left)
batog[interval]=std::max(batog[interval], v[right++]);
}
}
return 0;
}