Pagini recente » Cod sursa (job #935045) | Cod sursa (job #789956) | Cod sursa (job #2101375) | Cod sursa (job #1557713) | Cod sursa (job #1789158)
#include <iostream>
#include <fstream>
#include <cmath>
const int MAX = 100000;
void println(std::ostream& stream, int v[], int len){
for(int i = 0; i < len; i++){
stream << v[i] << " ";
}
std::cout << "\n";
}
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 = b / sqrt_n - 1;
int maxim = v[a];
for(int j = a; j < firstMax * sqrt_n; j++){
if(v[j] > maxim){
maxim = v[j];
}
}
for(int j = firstMax; j <= lastMax; j++){
if(maxs[j] > maxim){
maxim = maxs[j];
}
}
for(int j = (lastMax + 1) * sqrt_n; 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;
}