Pagini recente » Cod sursa (job #792372) | Cod sursa (job #179469) | Cod sursa (job #335887) | Cod sursa (job #2021066) | Cod sursa (job #3150367)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
#define MAX_N 131072
//#define MAX_N 8
int tree[MAX_N * 2];
int f(int node, int node_low, int node_high, int querry_low, int querry_high)
{
if(querry_low <= node_low && node_high <= querry_high) //apartine total intervalului
{
return tree[node];
}
if(node_high < querry_low || querry_high < node_low) //nu se intersecteaza deloc cu intervalul
{
return -1;
}
int last_in_left = (node_low + node_high) / 2;
return max(f(node * 2, node_low, last_in_left, querry_low, querry_high),
f(node * 2 + 1, last_in_left + 1, node_high, querry_low, querry_high));
}
void s(int node)
{
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
if(node == 1)
{
return;
}
s(node / 2);
}
int main()
{
int n, m, c, a, b;
in >> n >> m;
for(int i = 0; i < n; ++i)
{
in >> tree[MAX_N + i];
}
for(int i = MAX_N - 1; i > 0; --i) // creem arborele
{
tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
}
for(int i = 0; i < m; ++i)
{
in >> c >> a >> b;
if(c == 0)
{
out << f(1, 0, MAX_N - 1, a - 1, b - 1) << '\n';
} else
{
tree[MAX_N + a - 1] = b;
s((MAX_N + a - 1) / 2);
}
}
/*
for(int i = 1; i < MAX_N * 2; ++i)
cout << tree[i] << " ";
*/
return 0;
}