結果
問題 | No.2650 [Cherry 6th Tune *] セイジャク |
ユーザー |
![]() |
提出日時 | 2024-02-23 21:46:31 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 444 ms / 2,500 ms |
コード長 | 6,413 bytes |
コンパイル時間 | 2,529 ms |
コンパイル使用メモリ | 209,724 KB |
最終ジャッジ日時 | 2025-02-19 19:39:43 |
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
ソースコード
#include <bits/stdc++.h>#ifdef LOCAL#include "./debug.cpp"#else#define debug(...)#define print_line#endifusing namespace std;using ll = long long;template <typename T, typename U>struct segment_tree_lazy {template <typename F, typename G, typename H>segment_tree_lazy(int n, F f, G g, H h, T et, U eu) {this->n = 1;while (this->n < n) this->n *= 2;this->f = f;this->g = g;this->h = h;this->et = et;this->eu = eu;dat = vector<T>(this->n * 2 - 1, et);lazy = vector<U>(this->n * 2 - 1, eu);}void build(const vector<T> &a) {for (int i = 0; i < (int)a.size(); i++) dat[i + n - 1] = a[i];for (int i = n - 2; i >= 0; i--) dat[i] = f(dat[i * 2 + 1], dat[i * 2 + 2]);}void set(int i, T x) {evaluate(i);i += n - 1;dat[i] = x;while (i > 0) {i = (i - 1) / 2;dat[i] = f(dat[i * 2 + 1], dat[i * 2 + 2]);}}void apply(int l, int r, U x) {apply(l, r, 0, x, 0, n);}T query(int l, int r) {return query(l, r, 0, 0, n);}T operator[](int i) {return query(i, i + 1, 0, 0, n);}friend ostream &operator<<(ostream &os, segment_tree_lazy a) {int n = a.n;os << "[ ";for (int i = 0; i < n; i++) {os << a[i];if (i != n - 1) os << ", ";}os << " ]";return os;}private:int n;vector<T> dat;vector<U> lazy;using F = function<T(T, T)>;using G = function<T(U, T)>;using H = function<U(U, U)>;F f;G g;H h;T et;U eu;void evaluate(int i) {if (lazy[i] == eu) return;if (i < n - 1) {lazy[i * 2 + 1] = h(lazy[i], lazy[i * 2 + 1]);lazy[i * 2 + 2] = h(lazy[i], lazy[i * 2 + 2]);}dat[i] = g(lazy[i], dat[i]);lazy[i] = eu;}void apply(int left, int right, int i, U x, int l, int r) {evaluate(i);if (left <= l && r <= right) {lazy[i] = h(x, lazy[i]);evaluate(i);} else if (left < r && l < right) {int mid = (l + r) / 2;apply(left, right, i * 2 + 1, x, l, mid);apply(left, right, i * 2 + 2, x, mid, r);dat[i] = f(dat[i * 2 + 1], dat[i * 2 + 2]);}}T query(int left, int right, int i, int l, int r) {evaluate(i);if (r <= left || right <= l) {return et;} else if (left <= l && r <= right) {return dat[i];} else {int mid = (l + r) / 2;return f(query(left, right, i * 2 + 1, l, mid), query(left, right, i * 2 + 2, mid, r));}}};template <typename T, typename U>segment_tree_lazy<T, U> range_add_range_min(int n) {const T et = numeric_limits<T>::max();const U eu = 0;auto f = [](T a, T b) {return min(a, b);};auto g = [](U f, T x) {return f + x;};auto h = [](U f, U g) {return f + g;};return segment_tree_lazy<T, U>(n, f, g, h, et, eu);}template <typename T, typename U>segment_tree_lazy<T, U> range_add_range_max(int n) {const T et = numeric_limits<T>::min();const U eu = 0;auto f = [](T a, T b) {return max(a, b);};auto g = [](U f, T x) {return f + x;};auto h = [](U f, U g) {return f + g;};return segment_tree_lazy<T, U>(n, f, g, h, et, eu);}template <typename T, typename U>segment_tree_lazy<pair<T, int>, U> range_add_range_sum(int n) {using T2 = pair<T, int>;const T2 et = make_pair(T(0), 0);const U eu = 0;auto f = [](T2 a, T2 b) {return make_pair(a.first + b.first, a.second + b.second);};auto g = [](U f, T2 x) {return make_pair(x.first + (T)f * x.second, x.second);};auto h = [](U f, U g) {return f + g;};return segment_tree_lazy<T2, U>(n, f, g, h, et, eu);}template <typename T>segment_tree_lazy<T, T> range_update_range_min(int n, T eu = numeric_limits<T>::max()) {const T et = numeric_limits<T>::max();auto f = [](T a, T b) {return min(a, b);};auto g = [eu](T f, T x) {if (f == eu) return x;return f;};return segment_tree_lazy<T, T>(n, f, g, g, et, eu);}template <typename T>segment_tree_lazy<T, T> range_update_range_max(int n, T eu = numeric_limits<T>::max()) {const T et = numeric_limits<T>::min();auto f = [](T a, T b) {return max(a, b);};auto g = [eu](T f, T x) {if (f == eu) return x;return f;};return segment_tree_lazy<T, T>(n, f, g, g, et, eu);}template <typename T>segment_tree_lazy<pair<T, int>, T> range_update_range_sum(int n, T eu = numeric_limits<T>::max()) {using T2 = pair<T, int>;const T2 et = make_pair(T(0), 0);auto f = [](T2 a, T2 b) {return make_pair(a.first + b.first, a.second + b.second);};auto g = [eu](T f, T2 x) {if (f == eu) return x;return make_pair(f * x.second, x.second);};auto h = [eu](T f, T g) {if (f == eu) return g;return f;};return segment_tree_lazy<T, T>(n, f, g, h, et, eu);}template <typename T>vector<int> compress(vector<T> &a) {int n = a.size();vector<int> ret(n);for (int i = 0; i < n; i++) ret[i] = a[i];sort(ret.begin(), ret.end());ret.erase(unique(ret.begin(), ret.end()), ret.end());for (int i = 0; i < n; i++) a[i] = lower_bound(ret.begin(), ret.end(), a[i]) - ret.begin();return ret;}int main() {int N, A;cin >> N >> A;vector<int> num, X(N);int idx = 0;for (int i = 0; i < N; i++) {int x;cin >> x;num.push_back(x);X[i] = idx++;}int T;cin >> T;vector<int> L(T), R(T);for (int i = 0; i < T; i++) {int l, r;cin >> l >> r;num.push_back(l);num.push_back(r);L[i] = idx++;R[i] = idx++;}compress(num);auto seg = range_update_range_max<int>(3e5, -1);for (int i = 0; i < T; i++) {seg.apply(num[L[i]], num[R[i]] + 1, i + 1);}for (int i = 0; i < N; i++) {cout << max(seg[num[X[i]]], -1) << '\n';}}