Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <cmath>
- #include <iostream>
- #include <map>
- #include <set>
- #include <stack>
- #include <string>
- #include <tuple>
- #include <unordered_map>
- #include <unordered_set>
- #include <vector>
- typedef long long ll;
- using namespace std;
- // Степень 2, больше либо равная n.
- int UpLog2(int n) {
- int k = 0;
- while (1 << k < n) ++k;
- return k;
- }
- // l и r включительно
- void fight(vector<int>& t, vector<int>& result, int v, int lx, int rx, int l, int r, int x) {
- if (t[v] >= 0) { // На данном диапазоне есть победитель
- if (l <= t[v] && t[v] <= r && t[v] != x && result[t[v]] == -1) { // x – победитель t[v]
- result[t[v]] = x;
- t[v] = x;
- }
- return;
- }
- if (r < lx || rx < l) return;
- // Это точно не лист (иначе t[v] >= 0)
- int mx = (lx + rx) / 2;
- fight(t, result, 2 * v, lx, mx, l, r, x);
- fight(t, result, 2 * v + 1, mx + 1, rx, l, r, x);
- if (l <= lx && rx <= r) {
- t[v] = x; // Новый победитель диапазона
- }
- }
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int m = 0, q = 0; cin >> m >> q;
- int n = 1 << UpLog2(m);
- std::vector<int> t(2 * n, -1); // В узлах -1 означает, что победитель еще не определен.
- // Номера победителей в листьях.
- for (int i = 0; i < m; ++i) t[n + i] = i;
- vector<int> result(m, -1);
- for (int i = 0; i < q; ++i) {
- int l, r, x; cin >> l >> r >> x;
- --l; --r; --x;
- fight(t, result, 1, 0, n - 1, l, r, x);
- }
- for (int i = 0; i < m; ++i) {
- cout << result[i] + 1 << " ";
- }
- cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement