Pagini recente » Cod sursa (job #384541) | Cod sursa (job #989158) | Cod sursa (job #279567) | Cod sursa (job #1500081) | Cod sursa (job #1789129)
#include <iostream>
#include <fstream>
#include <cmath>
const int MAX = 100000;
int main(){
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
int n, m;
int v[MAX], maxs[1000];
fin >> n >> m;
int sqrt_n = std::sqrt(n);
for(int i = 0; i < n; i++){
fin >> v[i];
}
//constructia maximelor partiale
for(int i = 0; i * i <= n; i++){
int maxim = v[i * sqrt_n];
for(int j = i * sqrt_n; j < (i + 1) * sqrt_n && j < n; j++){
if(v[j] > maxim){
maxim = v[j];
}
}
maxs[i] = maxim;
}
for(int i = 0; i < m; i++){
int op, a, b;
fin >> op >> a >> b;
if(op == 0){
a--;
b--;
int firstMax = a / sqrt_n + 1;
int lastMax = a / sqrt_n;
int maxim = v[a];
for(int j = a; j < firstMax * sqrt_n; j++){
if(v[j] > maxim){
maxim = v[a];
}
}
for(int j = firstMax; j <= lastMax; j++){
if(maxs[j] > maxim){
maxim = maxs[j];
}
}
for(int j = lastMax * sqrt_n + 1; j <= b; j++){
if(v[j] > maxim){
maxim = v[j];
}
}
fout << maxim << "\n";
}else if(op == 1){
a--;
v[a] = b;
int gr = a / sqrt_n;
int maxim = v[gr * sqrt_n];
for(int j = gr * sqrt_n; j < (gr + 1) * sqrt_n; j++){
if(v[j] > maxim){
maxim = v[j];
}
}
maxs[gr] = maxim;
}
}
fin.close();
fout.close();
return 0;
}