Pagini recente » Cod sursa (job #1882770) | Cod sursa (job #2829163) | Cod sursa (job #3219272) | Cod sursa (job #2557607) | Cod sursa (job #2373580)
#include <fstream>
#include <vector>
#define N 200005
#define left(node) 2 * node
#define right(node) 2 * node + 1
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
struct interval
{
int l, r, mij;
long long val;
interval() : l(0), r(0), mij(0), val(0) {};
interval(int L, int R, long long V) : l(L), r(R), mij((L + R) / 2), val(V) {};
};
int m, n;
interval tree[N];
auto maxx = [](long long a, long long b) {return (a > b ? a : b); };
void build_tree(int node, int st, int dr)
{
if (st == dr)
{
long long x;
f >> x;
tree[node] = interval(st, dr, x);
}
else
{
int mij = (st + dr) / 2;
build_tree(left(node), st, mij);
build_tree(right(node), mij + 1, dr);
tree[node] = interval(st, dr, maxx(tree[left(node)].val, tree[right(node)].val));
}
}
#pragma region update
int _update_pos;
long long _update_nr;
void _update_tree(int node)
{
if (tree[node].l == tree[node].r && tree[node].r == _update_pos)
tree[node].val = _update_nr;
else
{
if (_update_pos <= tree[node].mij)
_update_tree(left(node));
else _update_tree(right(node));
tree[node].val = maxx(tree[left(node)].val, tree[right(node)].val);
}
}
void update(int pos, long long nr)
{
_update_pos = pos;
_update_nr = nr;
_update_tree(1);
}
#pragma endregion
#pragma region query
long long _query_result;
int _q_left, _q_right;
void _query(int node)
{
if (_q_left <= tree[node].l && _q_right >= tree[node].r)
{
if (tree[node].val > _query_result)
_query_result = tree[node].val;
return;
}
if (_q_left <= tree[node].mij)
_query(left(node));
if (_q_right > tree[node].mij)
_query(right(node));
}
long long query(int L, int R)
{
_q_left = L;
_q_right = R;
_query_result = -1;
_query(1);
return _query_result;
}
#pragma endregion
int main()
{
char x;
int y;
long long z;
f >> n >> m;
build_tree(1, 1, n);
while (m--)
{
f >> x >> y >> z;
if (x == '0')
g << query(y, z) << "\n";
else update(y, z);
}
return 0;
}