Pagini recente » Cod sursa (job #496465) | Cod sursa (job #581776) | Cod sursa (job #2632990) | Clasament FMI No Stress 3 | Cod sursa (job #3173089)
#include <iostream>
#include <fstream>
#include <math.h>
#define NMAX 100003
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, v[NMAX], sq, batog_size, batog[400], interval;
void build_batog(){
for(int i=1;i<=n;i++){
int j=i/sq;
if(v[i]>batog[j])
batog[j]=v[i];
}
}
int query(int left, int right){
int firstInterval = (left + sq - 1) / sq * sq;
int lastInterval = right / sq * sq+1;
int firstIntervalc=firstInterval/sq;
int lastIntervalc=lastInterval/sq;
int el_max=0;
//cout<<firstInterval<<" "<<lastInterval<<"\n";
while(left<=right&&left<firstInterval){
if(v[left]>el_max)
el_max=v[left];
left++;
}
while(right>=left&&right>lastInterval){
if(v[right]>el_max)
el_max=v[right--];
right--;
}
while(firstIntervalc<=lastIntervalc){
if(batog[firstIntervalc]>el_max)
el_max=batog[firstIntervalc];
firstIntervalc++;
}
return el_max;
}
int main()
{
fin>>n>>m;
sq=sqrt(n);
batog_size=(n+sq-1)/sq;
for(int i=1;i<=n;i++)
fin>>v[i];
build_batog();
int operatie, e1, e2;
for(int i=0;i<m;i++){
fin>>operatie>>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(left<=right){
if(v[left]>batog[interval])
batog[interval]=v[left];
left++;
}
}
}
return 0;
}