# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
306348 | syy | Deda (COCI17_deda) | C++17 | 585 ms | 26496 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair <int, int> pi; //Station, child
struct node { // Creates a struct for the node of a seg tree
int s, e, m;
pi v; // start, end, middle, rangemin value
node *l, *r; // pointer to left, right subnodes
node(int _s, int _e) { //Constructor to create nodes l and r
s = _s; e = _e; m = (s+e)/2; // initialize variables
v.second = INT_MAX;
v.first = INT_MAX;
if (s!=e) { // is not a leaf node
l = new node(s, m); // create child nodes
r = new node(m+1, e);
}
}
void up(int x, int nv) { //update position x to nv (new value)
if (s==e) { //if node is a leaf, just modify v.
v = pi(nv, x);
return;
}
if (x>m) r->up(x, nv); //update right subtree if update is in right subtree
if (x<=m) l->up(x, nv); //update left subtree if update is in left subtree
v = min(l->v, r->v); //Modify the value of v after updating children
}
pi rmq(int x, int y) { //range min query from position x, y
if (s==x && e==y) return v; //return range min if query range corresponds
if (x>m) return r->rmq(x, y); //query right tree if range only lies there
if (y<=m) return l->rmq(x, y); //query left tree if range only lies there
return min(l->rmq(x, m), r->rmq(m+1, y)); //minimum of both queries as range spans both trees
}
} *root; // declares root as a pointer node. Root is the name of the segment tree.
int n, q, a, b;
char x;
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
root = new node(1, n);
for (int i = 0; i < q; i++) {
cin >> x >> a >> b;
if (x == 'M') root -> up(b, a);
else {
int counter = 0;
int c;
pi cur, previ;
c = n;
while (true) {
counter++;
cur = root -> rmq(b, c);
if (cur.first > a && counter == 1) {
cout << -1 << "\n";
break;
} else if (cur.second == b && cur.first <= a) {
cout << cur.second << "\n";
break;
} else if (cur.first > a) {
cout << previ.second << "\n";
break;
}
previ = cur;
c = cur.second - 1;
}
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |