| Task: | Dynamic Range Minimum Queries |
| Sender: | aalto26dh_045 |
| Submission time: | 2026-09-19 20:53:19 +0300 |
| Language: | C++ (C++20) |
| Status: | READY |
| Result: | ACCEPTED |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.00 s | details |
| #2 | ACCEPTED | 0.49 s | details |
Code
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdint>
using namespace std;
long long minTree(const vector<long long>& tree, long long a, long long b)
{
long long n = tree.size() / 2;
a--;
b--;
a += n;
b += n;
long long minVal = 10e9+1;
while (a <= b)
{
if (a % 2 == 1)
{
minVal = min(minVal, tree[a++]);
}
if (b % 2 == 0)
{
minVal = min(minVal, tree[b--]);
}
a /= 2;
b /= 2;
}
return minVal;
}
void add(vector<long long>& tree, long long k, long long u)
{
k--;
long long n = tree.size() / 2;
k += n;
tree[k] = u;
for (k /= 2; k > 0; k /= 2)
{
tree[k] = min(tree[2 * k], tree[2 * k + 1]);
}
}
int main()
{
long long n, q;
cin >> n >> q;
vector<long long> segmentTree(2 * n);
for (long long i = n; i < 2 * n; i++)
{
cin >> segmentTree[i];
}
for (long long i = n - 1; i > 0; i--)
{
segmentTree[i] = min(segmentTree[2 * i], segmentTree[2 * i + 1]);
}
for (long long i = 0; i < q; i++)
{
long long op, a, b;
cin >> op >> a >> b;
if (op == 1)
{
add(segmentTree, a, b);
}
else
{
cout << minTree(segmentTree, a, b) << endl;
}
}
}Test details
Test 1
Verdict: ACCEPTED
| input |
|---|
| 8 80 7 6 4 6 2 9 4 8 2 1 1 2 1 2 2 1 3 ... |
| correct output |
|---|
| 7 6 4 4 2 ... |
| user output |
|---|
| 7 6 4 4 2 ... |
Test 2
Verdict: ACCEPTED
| input |
|---|
| 200000 200000 398739055 65343131 699208332 3... |
| correct output |
|---|
| 28609 129890 20378 20378 311522 ... |
| user output |
|---|
| 28609 129890 20378 20378 311522 ... |
