Pagini recente » Cod sursa (job #1321080) | Cod sursa (job #1313551) | Cod sursa (job #919585) | Cod sursa (job #653761) | Cod sursa (job #1480042)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m;
int a[100001];
int segmentTree[200001];
int operation, leftLimitOfInterval , rightLimitOfInterval, position, value, x, y;
void initializeSegmentTree(int node, int left, int right){
if (left==right){
segmentTree[node] = a[left];
}
else
{
int middle = (left+ right)/2;
initializeSegmentTree(2*node, left, middle);
initializeSegmentTree(2*node+1, middle+1, right);
segmentTree[node] = max(segmentTree[2*node], segmentTree[2*node+1]);
}
return;
}
int maxOnInterval(int node, int left, int right){
if (left>=leftLimitOfInterval && right<=rightLimitOfInterval) return segmentTree[node];
else {
int middle = (left + right)/2;
if (middle+1>rightLimitOfInterval) return maxOnInterval(2*node, left, middle);
else if (middle<leftLimitOfInterval) return maxOnInterval(2*node+1, middle+1, right);
else return max(maxOnInterval(2*node, left, middle), maxOnInterval(2*node+1, middle+1, right));
}
}
void updateElement(int node, int left, int right){
if (left==right) segmentTree[node] = value;
else{
int middle = (left + right)/2;
if (position<=middle) updateElement(2*node, left, middle);
else updateElement(2*node+1, middle+1, right);
segmentTree[node] = max(segmentTree[2*node], segmentTree[2*node+1]);
}
return;
}
int main(void){
in >> n >> m;
for (int i=1; i<=n; i++) in >> a[i];
initializeSegmentTree(1, 1, n);
for (int i = 0; i<m; i++){
in >> operation >> x >> y;
if (operation == 0) {
leftLimitOfInterval = x;
rightLimitOfInterval = y;
out << maxOnInterval(1, 1, n) << "\n";
}
else{
position = x;
value = y;
updateElement(1,1,n);
}
}
return 0;
}