This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM \
"http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_A"
// header file section
#include <iostream>
#include <vector>
#include "../../data_type/min_monoid.hpp"
#include "../../segment_tree/segment_tree.hpp"
using namespace std;
using llong = long long;
llong n, q;
llong com, x, y;
int main() {
cin >> n >> q;
vector<llong> v(n, (1ll << 31) - 1);
SegmentTree<MinMonoid<llong>> seg(v.begin(), v.end());
for (int i = 0; i < q; i++) {
cin >> com >> x >> y;
if (com == 0) {
seg.update(x, y);
} else {
cout << seg.fold(x, y + 1) << '\n';
}
}
return 0;
};
#line 1 "test/aoj/DSL2A_1.test.cpp"
#define PROBLEM \
"http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_A"
// header file section
#include <iostream>
#include <vector>
#line 1 "data_type/min_monoid.hpp"
#include <algorithm>
#include <limits>
#include <numeric>
//===
template <class T>
struct MinMonoid {
using value_type = T;
inline static T identity() {
return std::numeric_limits<T>::max();
};
inline static T operation(const T a, const T b) {
return std::min(a, b);
};
};
//===
#line 1 "segment_tree/segment_tree.hpp"
#include <functional>
#include <iterator>
#line 7 "segment_tree/segment_tree.hpp"
//===
template <class Monoid>
struct SegmentTree {
using T = typename Monoid::value_type;
std::vector<T> tree;
SegmentTree() = default;
explicit SegmentTree(int n) : tree(n << 1, Monoid::identity()){};
template <class InputIterator>
SegmentTree(InputIterator first, InputIterator last) {
tree.assign(distance(first, last) << 1, Monoid::identity());
int i;
i = size();
for (InputIterator itr = first; itr != last; itr++) {
tree[i++] = *itr;
}
for (i = size() - 1; i > 0; i--) {
tree[i] = Monoid::operation(tree[(i << 1)], tree[(i << 1) | 1]);
}
};
inline int size() {
return tree.size() >> 1;
};
inline T operator[](int k) {
return tree[k + size()];
};
void set(int k, const T dat) {
k += size();
tree[k] = dat;
while (k > 1) {
k >>= 1;
tree[k] = Monoid::operation(tree[(k << 1)], tree[(k << 1) | 1]);
}
};
void update(int k, const T dat) {
set(k, dat);
};
// [l, r)
T fold(int l, int r) {
l += size(); // points leaf
r += size();
T lv = Monoid::identity();
T rv = Monoid::identity();
while (l < r) {
if (l & 1) lv = Monoid::operation(lv, tree[l++]);
if (r & 1) rv = Monoid::operation(tree[--r], rv);
l >>= 1;
r >>= 1;
}
return Monoid::operation(lv, rv);
};
template <class F>
inline int sub_tree_search(int i, T sum, F f) {
while (i < size()) {
T x = Monoid::operation(sum, tree[i << 1]);
if (f(x)) {
i = i << 1;
} else {
sum = x;
i = (i << 1) | 1;
}
}
return i - size() + 1;
}
template <class F>
int find_first(int l, F f) {
l += size();
int r = size() * 2; // r = n;
int tmpr = r;
int shift = 0;
T sum = Monoid::identity();
while (l < r) {
if (l & 1) {
if (f(Monoid::operation(sum, tree[l]))) {
return sub_tree_search(l, sum, f);
}
sum = Monoid::operation(sum, tree[l]);
l++;
}
l >>= 1;
r >>= 1;
shift++;
}
while (shift > 0) {
shift--;
r = tmpr >> shift;
if (r & 1) {
r--;
if (f(Monoid::operation(sum, tree[r]))) {
return sub_tree_search(r, sum, f);
}
sum = Monoid::operation(sum, tree[r]);
}
}
return -1;
};
};
//===
#line 10 "test/aoj/DSL2A_1.test.cpp"
using namespace std;
using llong = long long;
llong n, q;
llong com, x, y;
int main() {
cin >> n >> q;
vector<llong> v(n, (1ll << 31) - 1);
SegmentTree<MinMonoid<llong>> seg(v.begin(), v.end());
for (int i = 0; i < q; i++) {
cin >> com >> x >> y;
if (com == 0) {
seg.update(x, y);
} else {
cout << seg.fold(x, y + 1) << '\n';
}
}
return 0;
};