Pagini recente » Cod sursa (job #2309261) | Cod sursa (job #331549) | Cod sursa (job #505571) | Cod sursa (job #975029) | Cod sursa (job #3172261)
#include <fstream>
#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
#define N_MAX 100005
#define SQ_N 700
// int const BATOG_SIZE = SQ_N + 2; // numarul de intervale
int v[N_MAX], batog[SQ_N];
int n, querries, sqn;
void build (){ // ok
for (int i=0; i<n; ++i){
batog[i / sqn] = max(batog[i/sqn], v[i]);
}
}
void update (int a, int b){ // ok
batog[a/sqn] = 0;
v[a] = b;
int start = (a / sqn) * sqn;
int finish = start + sqn;
for (int i=start; i<finish; ++i)
batog[i/sqn] = max(batog[i/sqn], v[i]); // se adapteaza doar intervalul respectiv
}
int getMax (int left, int right){
int firstInterval, lastInterval, result = 0;
firstInterval = (left + sqn - 1) / sqn * sqn;
lastInterval = right / sqn * sqn;
while (left <= right && left < firstInterval)
result = max(result, v[left++]);
while (right >= left && right >= lastInterval)
result = max(result, v[right--]);
firstInterval /= sqn;
lastInterval /= sqn;
while (firstInterval < lastInterval)
result = max(batog[firstInterval++], result);
return result;
}
int main (){
in >> n >> querries;
sqn = sqrt(n);
for (int i=0; i<n; ++i) // trebuie sa incep de la 0, pentru ca accesez un element impartind la SQ_N
in >> v[i];
build();
int operand, a, b;
for (int i=1; i<=querries; ++i){
in >> operand >> a >> b;
if (operand == 0){
out << getMax(a-1, b-1) << '\n';
}
else{
update(a-1, b); // incep cu iindicii de la 0
}
// for (int k=0; k<n; k++)
// cout << v[k] << ' ';
// cout << '\n';
// for (int j=0; j<n; j++)
// cout << batog[j] << ' ';
// cout << '\n';
}
return 0;
}