結果

問題 No.2650 [Cherry 6th Tune *] セイジャク
ユーザー ococonomy1
提出日時 2024-02-23 21:45:56
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 316 ms / 2,500 ms
コード長 6,211 bytes
コンパイル時間 1,244 ms
コンパイル使用メモリ 118,588 KB
最終ジャッジ日時 2025-02-19 19:39:09
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 31
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

//#pragma GCC target("avx2")
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <climits>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#include <vector>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
using pli = pair<ll,int>;
#define TEST cerr << "TEST" << endl
#define AMARI 998244353
//#define AMARI 1000000007
#define el '\n'
#define El '\n'
template <typename T> vector<T> getvec(int n,T val){
vector<T> ans(n);
for(int i = 0; i < n; i++){
cin >> ans[i];
ans[i] += val;
}
return ans;
}
template <typename T> void printvec(vector<T> const& a,T val){
int n = a.size();
for(int i = 0; i < n; i++){
cout << (a[i] + val);
if(i != n - 1)cout << ' ';
}
cout << '\n';
}
//
//
template <typename T> class ococo_ruq_lazy_segtree {
public:
int n;
T tmax;
// rsq:Range Sum Query
vector<T> rsq, lazy_rsq;
// rmq;Range Minimum Query
vector<T> rmq, lazy_rmq;
ococo_ruq_lazy_segtree(int N, T d) {
syokica(N, d);
}
// O(N)
//(,(intIINF))
void syokica(int a, T d) {
n = 1;
tmax = d;
while(n < a) n *= 2;
rsq.resize(2 * n - 1);
rmq.resize(2 * n - 1);
lazy_rsq.resize(2 * n - 1);
lazy_rmq.resize(2 * n - 1);
for(int i = 0; i < 2 * n - 1; i++) {
rsq[i] = 0;
rmq[i] = tmax;
lazy_rsq[i] = tmax;
lazy_rmq[i] = tmax;
}
}
// k O(1)
void lazy_evaluate(int k, int l, int r) {
if(lazy_rsq[k] != tmax) {
rsq[k] = lazy_rsq[k];
if(r - l > 1) {
lazy_rsq[2 * k + 1] = (lazy_rsq[k] / 2);
lazy_rsq[2 * k + 2] = (lazy_rsq[k] / 2);
}
lazy_rsq[k] = tmax;
}
if(lazy_rmq[k] != tmax) {
rmq[k] = lazy_rmq[k];
if(r - l > 1) {
lazy_rmq[2 * k + 1] = lazy_rmq[k];
lazy_rmq[2 * k + 2] = lazy_rmq[k];
}
lazy_rmq[k] = tmax;
}
}
void update_num2(int a, int b, T x, int k, int l, int r) {
lazy_evaluate(k, l, r);
if(b <= l || r <= a) return;
if(a <= l && r <= b) {
lazy_rmq[k] = x;
lazy_rsq[k] = (T)(r - l) * x;
lazy_evaluate(k, l, r);
} else {
update_num2(a, b, x, 2 * k + 1, l, (l + r) / 2);
update_num2(a, b, x, 2 * k + 2, (l + r) / 2, r);
//
rmq[k] = min(rmq[2 * k + 1], rmq[2 * k + 2]);
rsq[k] = rsq[2 * k + 1] + rsq[2 * k + 2];
}
}
//[l,r)x O(logN)
void update_num(int l, int r, T x) {
update_num2(l, r, x, 0, 0, n);
}
T get_sum2(int a, int b, int k, int l, int r) {
if(r <= a || b <= l) return 0;
lazy_evaluate(k, l, r);
if(a <= l && r <= b) return rsq[k];
else {
return (get_sum2(a, b, k * 2 + 1, l, (l + r) / 2) + get_sum2(a, b, k * 2 + 2, (l + r) / 2, r));
}
}
//[l,r) O(logN)
T get_sum(int l, int r) {
return get_sum2(l, r, 0, 0, n);
}
T get_minimum2(int a, int b, int k, int l, int r) {
if(r <= a || b <= l) return tmax;
lazy_evaluate(k, l, r);
if(a <= l && r <= b) return rmq[k];
else return min(get_minimum2(a, b, k * 2 + 1, l, (l + r) / 2), get_minimum2(a, b, k * 2 + 2, (l + r) / 2, r));
}
//[l,r) O(logN)
T get_minimum(int l, int r) {
return get_minimum2(l, r, 0, 0, n);
}
};
#define MULTI_TEST_CASE false
void solve(void){
//
//
//
//
//
int n;
ll a;
cin >> n >> a;
vector<ll> x = getvec<ll>(n,0);
int t;
cin >> t;
vector<ll> l(t),r(t);
for(int i = 0; i < t; i++){
cin >> l[i] >> r[i];
}
vector<ll> temp(n + 2 * t);
for(int i = 0; i < n; i++)temp[i] = x[i];
for(int i = 0; i < t; i++){
temp[i + n] = l[i];
temp[i + n + t] = r[i];
}
sort(temp.begin(),temp.end());
temp.erase(unique(temp.begin(),temp.end()),temp.end());
const int m = temp.size();
for(int i = 0; i < n; i++){
x[i] = distance(temp.begin(),lower_bound(temp.begin(),temp.end(),x[i]));
}
for(int i = 0; i < t; i++){
l[i] = distance(temp.begin(),lower_bound(temp.begin(),temp.end(),l[i]));
r[i] = distance(temp.begin(),lower_bound(temp.begin(),temp.end(),r[i]));
}
ococo_ruq_lazy_segtree<int> ruq(m,INT_MAX);
ruq.update_num(0,m,1);
for(int i = 0; i < t; i++){
ruq.update_num(l[i],r[i] + 1,(i + 1) * -1);
}
vector<int> ans(n,0);
for(int i = 0; i < n; i++){
ans[i] = ruq.get_minimum(x[i],x[i] + 1);
ans[i] *= -1;
}
for(int i = 0; i < n; i++){
cout << ans[i] << el;
}
return;
}
void calc(void){
return;
}
signed main(void){
cin.tie(nullptr);
ios::sync_with_stdio(false);
calc();
int t = 1;
if(MULTI_TEST_CASE)cin >> t;
while(t--){
solve();
}
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0