Pagini recente » Cod sursa (job #344694) | Cod sursa (job #484608) | Cod sursa (job #609490) | Cod sursa (job #2123495) | Cod sursa (job #3128267)
#include <bits/stdc++.h>
using namespace std;
using i64 = int64_t;
const i64 INF = INT_MAX;
class segtree{
private:
i64 len;
vector<i64> data;
i64 next_pow2(i64 n){
i64 res = 1;
while(res < n){
res *= 2;
}
res *= 2;
return res;
}
public:
segtree(i64 n, vector<i64>&v){
len = next_pow2(n);
data.assign(len, 0);
for(i64 i = 0; i < n; i++){
i64 id = len / 2 - 1 + i + 1;
data[id] = v[i];
while(id / 2 > 0){
id /= 2;
data[id] = max(data[id], v[i]);
}
}
}
void set_value(i64 idx, i64 x){
idx += len/2 - 1;
data[idx] = x;
while(idx > 0){
idx /= 2;
data[idx] = max(data[idx * 2], data[idx * 2 + 1]);
}
}
i64 queryy(i64 l, i64 r, i64 cl, i64 cr, i64 idx){
if(cl >= l && cr <= r){
return data[idx];
}
i64 m = (cl+ cr) / 2;
if(m >= r){
return queryy(l, r, cl, m, idx * 2);
}else if(m < l){
return queryy(l, r, m + 1, cr, idx * 2 + 1);
}else{
return max(queryy(l, r, cl, m, idx * 2), queryy(l, r, m + 1, cr, idx * 2 + 1));
}
}
i64 query(i64 l, i64 r){
return queryy(l, r, 1, len / 2, 1);
}
};
int main()
{
i64 n, m;
cin >> n >> m;
vector<i64> v(n);
for(i64 i = 0; i < n; i++){
cin >> v[i];
}
segtree st(n, v);
i64 t, a, b;
for(i64 i = 0; i < m; i++){
cin >> t >> a >> b;
if(!t){
cout << st.query(a, b) << endl;
}else{
st.set_value(a, b);
}
}
return 0;
}