#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include template struct ModInt { int x; ModInt() : x(0) {} ModInt(long long y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {} ModInt &operator+=(const ModInt &p) { if ((x += p.x) >= mod) x -= mod; return *this; } ModInt &operator-=(const ModInt &p) { if ((x += mod - p.x) >= mod) x -= mod; return *this; } ModInt &operator*=(const ModInt &p) { x = (int)(1LL * x * p.x % mod); return *this; } ModInt &operator/=(const ModInt &p) { *this *= p.inverse(); return *this; } ModInt &operator^=(long long p) { // quick_pow here:3 ModInt res = 1; for (; p; p >>= 1) { if (p & 1) res *= *this; *this *= *this; } return *this = res; } ModInt operator-() const { return ModInt(-x); } ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; } ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; } ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; } ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; } ModInt operator^(long long p) const { return ModInt(*this) ^= p; } bool operator==(const ModInt &p) const { return x == p.x; } bool operator!=(const ModInt &p) const { return x != p.x; } explicit operator int() const { return x; } // added by QCFium ModInt operator=(const int p) { x = p; return ModInt(*this); } // added by QCFium ModInt inverse() const { int a = x, b = mod, u = 1, v = 0, t; while (b > 0) { t = a / b; a -= t * b; std::swap(a, b); u -= t * v; std::swap(u, v); } return ModInt(u); } friend std::ostream &operator<<(std::ostream &os, const ModInt &p) { return os << p.x; } friend std::istream &operator>>(std::istream &is, ModInt &a) { long long x; is >> x; a = ModInt(x); return (is); } }; using mint = ModInt<998244353>; const int MOD = 998244353; struct MComb { std::vector fact; std::vector inversed; MComb(int n) { // O(n+log(mod)) fact = std::vector(n + 1, 1); for (int i = 1; i <= n; i++) fact[i] = fact[i - 1] * mint(i); inversed = std::vector(n + 1); inversed[n] = fact[n] ^ (MOD - 2); for (int i = n - 1; i >= 0; i--) inversed[i] = inversed[i + 1] * mint(i + 1); } mint ncr(int n, int r) { if (n < r) return 0; return (fact[n] * inversed[r] * inversed[n - r]); } mint npr(int n, int r) { return (fact[n] * inversed[n - r]); } mint nhr(int n, int r) { assert(n + r - 1 < (int)fact.size()); return ncr(n + r - 1, r); } }; mint ncr(int n, int r) { mint res = 1; for (int i = n - r + 1; i <= n; i++) res *= i; for (int i = 1; i <= r; i++) res /= i; return res; } #include #include #include struct ChthollyNode { int l, r; mutable int v; ChthollyNode(int l, int r, int v) : l(l), r(r), v(v) {} bool operator<(const ChthollyNode &o) const { return l < o.l; } }; std::set tr; std::set::iterator split(int pos) { auto it = tr.lower_bound(ChthollyNode(pos, 0, 0)); if (it != tr.end() && it->l == pos) return it; it--; int l = it->l, r = it->r, v = it->v; tr.erase(it); tr.insert(ChthollyNode(l, pos - 1, v)); return tr.insert(ChthollyNode(pos, r, v)).first; } // range add void add(int l, int r, int v) { // [l, r] auto end = split(r + 1); for (auto it = split(l); it != end; it++) it->v += v; } // range assign void assign(int l, int r, int v) { auto end = split(r + 1), begin = split(l); // 顺序不能颠倒,否则可能RE tr.erase(begin, end); // 清除一系列节点 tr.insert(ChthollyNode(l, r, v)); // 插入新的节点 } // tr.insert(ChthollyNode(1, 1e9, 0)); // 初始化的时候插入一个大区间 // range kth int kth(int l, int r, int k) { auto end = split(r + 1); std::vector> v; // 这个pair里存节点的值和区间长度 for (auto it = split(l); it != end; it++) v.emplace_back(it->v, it->r - it->l + 1); std::sort(v.begin(), v.end()); // 直接按节点的值的大小排下序 for (int i = 0; i < v.size(); i++) // 然后挨个丢出来,直到丢出k个元素为止 { k -= v[i].second; if (k <= 0) return v[i].first; } } void solve() { int n, A; std::cin >> n >> A; std::vector a(n); for (int &x : a) std::cin >> x; int q; std::cin >> q; tr.insert(ChthollyNode(1, 1e9, -1)); for (int i = 0; i < q; i++) { int l, r; std::cin >> l >> r; // std::cout << l << ' ' << r << '\n'; assign(l, r, i + 1); } for (int i = 0; i < n; i++) { std::cout << kth(a[i], a[i], 1) << ' '; } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t = 1; // std::cin >> t; while (t--) { solve(); } }