Pagini recente » Cod sursa (job #441789) | Cod sursa (job #655056) | Cod sursa (job #1432989) | Cod sursa (job #142068) | Cod sursa (job #2487988)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int getTreeSize(int n){
int s = 1;
while(s<n){
s *= 2;
}
return s;
}
void updateSegTree(int idx, int val, vector<int> &tree){
tree[idx]=val;
idx /= 2;
while(idx > 0){
tree[idx] = max(tree[2*idx], tree[2*idx+1]);
idx /= 2;
}
}
int ans = -1;
void querySegment(int left, int right, int idx, int queryLeft, int queryRight, vector<int> tree){
if(queryLeft <= left && right <= queryRight){
ans = max(tree[idx], ans);
return;
}
int middle = (left+right)/2;
if(queryLeft <= middle)
querySegment(left, middle, 2*idx, queryLeft, queryRight, tree);
if(queryRight > middle)
querySegment(middle+1, right, 2*idx + 1, queryLeft, queryRight, tree);
}
void printVec(vector<int> V){
for(int a : V){
printf("%d ", a);
}
puts("");
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m, aux;
cin>>n>>m;
int treeSize = getTreeSize(n);
vector<int> segnemtTree(2*treeSize);
for(int i=0; i<n; i++){
cin>>aux;
segnemtTree[treeSize + i] = aux;
}
for(int t=treeSize-1; t>0; t--){
segnemtTree[t] = max(segnemtTree[2*t], segnemtTree[2*t+1]);
}
//printVec(segnemtTree);
int qType, p1, p2;
while(m--){
cin>>qType>>p1>>p2;
if(qType){
updateSegTree(treeSize+p1-1, p2, segnemtTree);
//printVec(segnemtTree);
}
else{
ans = -1;
querySegment(1, treeSize, 1, p1, p2, segnemtTree);
printf("%d\n", ans);
}
}
return 0;
}