Pagini recente » Cod sursa (job #2928009) | Cod sursa (job #442444) | Cod sursa (job #2016655) | Cod sursa (job #2305300) | Cod sursa (job #2897613)
#include <fstream>
#include <iostream>
#define MAX 100010
using namespace std;
int arbint[300010];
int left_n[300010];
int right_n[300010];
int v[MAX];
int max_on_range(int l, int r, int node){
if(l == left_n[node] && r == right_n[node])
return arbint[node];
int mid;
mid = (left_n[node] + right_n[node]) / 2;
if(mid < l)
return max_on_range(l, r, 2*node + 2);
else if(mid + 1 > r)
return max_on_range(l, r, 2*node + 1);
else
return max(max_on_range(l, mid, 2*node + 1), max_on_range(mid + 1, r, 2*node + 2));
}
void build(int node, int node_l, int node_r){
left_n[node] = node_l;
right_n[node] = node_r;
if(node_r == node_l)
arbint[node] = v[node_l];
else{
int mid;
mid = (node_l + node_r) / 2;
build(2*node + 1, node_l, mid);
build(2*node + 2, mid + 1, node_r);
arbint[node] = max(arbint[2*node + 1], arbint[2*node + 2]);
}
}
void update(int idx, int val, int node){
if(left_n[node] == right_n[node]){
arbint[node] = val;
v[idx] = val;
return;
}
int mid;
mid = (left_n[node] + right_n[node]) / 2;
if(mid < idx){
update(idx, val, 2*node + 2);
arbint[node] = max(arbint[2*node + 1], arbint[2*node + 2]);
}
else{
update(idx, val, 2*node + 1);
arbint[node] = max(arbint[2*node + 1], arbint[2*node + 2]);
}
}
string repeat(string s, int n){
if(n == 0)
return "";
else
return s + repeat(s, n - 1);
}
int main(){
ifstream fin;
ofstream fout;
fin.open("arbint.in");
fout.open("arbint.out");
int m, n, q, a, b, i;
fin >> n >> m;
for(i=0; i < n; ++i)
fin >> v[i];
build(0, 0, n - 1);
for(i=0; i < m; ++i){
fin >> q >> a >> b;
if(q){
update(a - 1, b, 0);
}
else{
fout << max_on_range(a - 1, b - 1, 0) << endl;
}
}
}