Pagini recente » Cod sursa (job #2487093) | Cod sursa (job #2338074) | Cod sursa (job #684339) | Cod sursa (job #2738400) | Cod sursa (job #2834289)
#include <fstream>
#include <vector>
using namespace std;
vector < int > Tree;
inline static void Update(int poz, int value, int n){
Tree[poz + n - 1] = value;
int i = (poz + n - 1) >> 1;
for(; i; i >>= 1)
Tree[i] = max(Tree[i << 1], Tree[i << 1 | 1]);
}
inline int MaximumQuery(int node, int left, int right, int q_left, int q_right){
if(right < q_left || left > q_right)
return 0;
if(q_left <= left && right <= q_right)
return Tree[node];
int mid = (left + right) >> 1;
return max(MaximumQuery(node << 1, left, mid, q_left, q_right),
MaximumQuery(node << 1 | 1, mid + 1, right, q_left, q_right));
}
int main(){
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, Queries;
cin >> n >> Queries;
vector < int > a(n + 1);
for(int i = 1; i <= n; ++i)
cin >> a[i];
while(__builtin_popcount(n) != 1){
a.push_back(0);
++n;
}
Tree.resize((n << 1) + 1);
for(int i = 1; i <= n; ++i)
Tree[n + i - 1] = a[i];
for(int i = n - 1; i >= 1; --i)
Tree[i] = max(Tree[i << 1], Tree[i << 1 | 1]);
int op, x, y;
while(Queries--){
cin >> op >> x >> y;
if( ! op) // Query
cout << MaximumQuery(1, 1, n, x, y) << '\n';
else // Update
Update(x, y, n);
}
return 0;
}