結果

問題 No.880 Yet Another Segment Tree Problem
ユーザー 7deQSJCy8c4Hg7I
提出日時 2024-09-04 13:29:38
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 14,984 bytes
コンパイル時間 5,653 ms
コンパイル使用メモリ 322,296 KB
実行使用メモリ 25,072 KB
最終ジャッジ日時 2024-09-04 13:30:31
合計ジャッジ時間 53,199 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 32 TLE * 1 -- * 4
権限があれば一括ダウンロードができます

ソースコード

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

#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
#include <cassert>
#include <cmath>
#include <functional>
#include <iostream>
#include <vector>
using namespace atcoder;
using ll = long long;
using ld = long double;
using Graph = vector<vector<int>>;
using vi = vector<int>;
using vl = vector<long>;
using vll = vector<long long>;
using vb = vector<bool>;
using vvi = vector<vi>;
using vvl = vector<vl>;
using vvb = vector<vb>;
using vvvb = vector<vvb>;
using vvll = vector<vll>;
using vvvll = vector<vvll>;
using vvvvll = vector<vvvll>;
using vvvvvll = vector<vvvvll>;
using vd = vector<double>;
using vvd = vector<vd>;
using vvvd = vector<vvd>;
using vld = vector<long double>;
using vvld = vector<vld>;
using vvvld = vector<vvld>;
using vc = vector<char>;
using vvc = vector<vc>;
using lll = __int128_t;
using vs = vector<string>;
using pii = pair<long long, long long>;
using mint = modint1000000007;
#define mp make_pair
#define reps(i, a, n) for (ll i = (a); i < (ll)(n); i++)
#define rep(i, n) for (ll i = (0); i < (ll)(n); i++)
#define rrep(i, n) for (ll i = (1); i < (ll)(n + 1); i++)
#define repd(i, n) for (ll i = n - 1; i >= 0; i--)
#define rrepd(i, n) for (ll i = n; i >= 1; i--)
#define ALL(n) n.begin(), n.end()
#define rALL(n) n.rbegin(), n.rend()
#define fore(i, a) for (auto &i : a)
#define IN(a, x, b) (a <= x && x < b)
#define IN(a, x, b) (a <= x && x < b)
#define INIT \
std::ios::sync_with_stdio(false); \
std::cin.tie(0);
std::random_device seed_gen;
std::mt19937_64 engine(seed_gen());
template <class T>
void output(T &W, bool x) {
cout << W;
if (!x)
cout << ' ';
else
cout << endl;
return;
}
// s
template <class T>
void output(vector<T> &W, bool s) {
rep(i, W.size()) { output(W[i], ((i == W.size() - 1) || s)); }
return;
}
// s
template <class T>
void output(vector<vector<T>> &W, bool s) {
rep(i, W.size()) { output(W[i], s); }
return;
}
template <class T>
T vectorsum(vector<T> &W, int a, int b) {
return accumulate(W.begin() + a, W.end() + b, (T)0);
}
template <class T>
T vectorsum(vector<T> &W) {
int b = W.size();
return accumulate(ALL(W), (T)0);
}
template <class T>
inline T CHMAX(T &a, const T b) {
return a = (a < b) ? b : a;
}
template <class T>
inline T CHMIN(T &a, const T b) {
return a = (a > b) ? b : a;
}
template <class T>
void input(T &W) {
cin >> W;
return;
}
template <class T>
void input(vector<T> &W) {
for (auto &u : W) input(u);
return;
}
template <class T, class TT>
void add(T &W, TT &a) {
W += a;
return;
}
template <class T>
void add(vector<T> &W, vector<T> &a) {
rep(i, W.size()) add(W[i], a[i]);
}
template <class T>
void add(T &W, T &a) {
W += a;
}
template <class T, class TT>
void add(vector<T> &W, TT a) {
for (auto &u : W) add(u, a);
return;
}
template <class T, class TT>
void mul(T &W, TT &a) {
W *= a;
return;
}
template <class T, class TT>
void mul(vector<T> &W, TT a) {
for (auto &u : W) mul(u, a);
return;
}
// [a,b)
long long randomINT(ll a, ll b) {
unsigned long long c = engine();
c %= (b - a);
c += a;
return c;
}
const double PI = acos(-1.0L);
const long double EPS = 1e-10;
const double INF = 1e18;
__int128_t Power(__int128_t a, __int128_t b, __int128_t m) {
__int128_t p = a, Answer = 1;
for (int i = 0; i < 63; i++) {
ll wari = (1LL << i);
if ((b / wari) % 2 == 1) {
Answer %= m;
Answer = (Answer * p) % m; // a 2^i
}
p %= m;
p = (p * p) % m;
}
return Answer;
}
void Yes(bool b) {
if (b)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
template <typename T>
vector<T> dycstra(vector<vector<pair<ll, T>>> G, ll N, ll K) {
vb kaku(N, false);
vector<T> cur(N, INF);
cur[K] = 0;
priority_queue<pair<T, ll>, vector<pair<T, ll>>, greater<pair<T, ll>>> Q;
Q.push(make_pair(cur[K], K));
while (!Q.empty()) {
ll pos = Q.top().second;
Q.pop();
if (kaku[pos]) continue;
kaku[pos] = true;
for (ll i = 0; i < G[pos].size(); i++) {
ll nex = G[pos][i].first;
T cost = G[pos][i].second;
if (cur[nex] > cur[pos] + cost - EPS) {
cur[nex] = cur[pos] + cost;
Q.push(make_pair(cur[nex], nex));
}
}
}
return cur;
}
ll randamX(ll K) {
ll a = engine();
a %= (K - 1);
a++;
return a;
}
template <typename T>
// [0,M)
vector<T> KAI(int M) {
vector<T> kai(M, 1);
rep(i, M - 1) { kai[i + 1] = kai[i] * (i + 1); }
return kai;
}
template <typename T>
vector<T> DIV(int M) {
vector<T> kai = KAI<T>(M), div(M, 1);
rep(i, M - 1) { div[i + 1] = 1 / kai[i + 1]; }
return div;
}
/* n_ary(string str, int n, int m)
n str m
使 string 使 ntodec,
decton, pow_ll 36
*/
string n_ary(string &str, int n, int m) {
str = "";
while (n) {
str.push_back('0' + n % m);
n /= m;
}
reverse(ALL(str));
return str;
}
template <typename T>
vector<T> compress(vector<T> &X) {
// vals
vector<T> vals = X;
sort(vals.begin(), vals.end());
// (unique), (erase)
vals.erase(unique(vals.begin(), vals.end()), vals.end());
//
for (int i = 0; i < (int)X.size(); i++) {
X[i] = lower_bound(vals.begin(), vals.end(), X[i]) - vals.begin();
}
return vals;
}
long long extGCD(long long a, long long b, long long &x, long long &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
long long d = extGCD(b, a % b, y, x);
y -= a / b * x;
return d;
}
std::ostream &operator<<(std::ostream &dest, __int128_t value) {
std::ostream::sentry s(dest);
if (s) {
__uint128_t tmp = value < 0 ? -value : value;
char buffer[128];
char *d = std::end(buffer);
do {
--d;
*d = "0123456789"[tmp % 10];
tmp /= 10;
} while (tmp != 0);
if (value < 0) {
--d;
*d = '-';
}
int len = std::end(buffer) - d;
if (dest.rdbuf()->sputn(d, len) != len) {
dest.setstate(std::ios_base::badbit);
}
}
return dest;
}
// priorty_queue
struct eraseable_priority_queue {
priority_queue<ll> Q1, Q2;
void push(ll K) { Q1.emplace(K); }
void erase(ll K) { Q2.emplace(K); }
ll top() {
while (!Q1.empty() && Q2.top() != Q1.top()) Q1.pop(), Q2.pop();
return Q1.top();
}
bool empty() {
while (!Q1.empty() && Q2.top() != Q1.top()) Q1.pop(), Q2.pop();
return Q1.empty();
}
};
struct TRI {
ll a;
ll b;
ll c;
ll d;
};
bool operator>(const TRI &r, const TRI &l) {
return (r.a > l.a | (r.a == l.a & r.b > l.b) |
(r.a == l.a & r.b == l.b & r.c > l.c));
}
bool operator<(const TRI &r, const TRI &l) {
return (r.a < l.a | (r.a == l.a & r.b < l.b) |
(r.a == l.a & r.b == l.b & r.c < l.c));
}
// (O(√N))
vll prime_factor(ll N) {
vll A;
for (ll i = 2; i * i <= N; i++) {
// cout << i << endl;
if (N % i == 0) {
while (N % i == 0) {
N /= i;
A.push_back(i);
}
}
}
if (N != 1) A.push_back(N);
return A;
}
//
// segtree beats
#include <bits/stdc++.h>
using namespace std;
//  https://smijake3.hatenablog.com/entry/2019/04/28/021457
namespace Segment_Tree_Beats_INVAl {
//
using R = long long;
// detaRSQ
struct T {
R sum;
R left;
R Max;
R len;
bool same;
T(R x) : sum(x), left(x), Max(x), len(1), same(true) {}
T(R x, R _size) : sum(x * _size), left(x), Max(x), len(_size), same(true) {}
T() : sum(0), left(0), Max(0), len(0), same(true) {}
};
// ()
T op(T a, T b) {
T ret;
ret.sum = a.sum + b.sum;
ret.left = a.left;
ret.Max = max(a.Max, b.Max);
ret.len = a.len + b.len;
ret.same = (a.same && b.same && (a.left == b.left));
return ret;
}
//
T e() { return T(); }
//
struct E {
R togcd;
R set;
E() : togcd(0), set(0) {}
E(R g, R up) : togcd(g), set(up) {}
static E GCD(R g) { return E(g, 0); }
static E update(R g) { return E(0, g); }
};
// data()
//
T mapping(E a, T b) {
if (!b.same) return b;
if (a.set) b = T(a.set, b.len);
if (a.togcd) {
b = T(gcd(b.Max, a.togcd), b.len);
}
return b;
}
// fnew
E composition(E fnew, E fold) {
if (fnew.set) {
return E::update(fnew.set);
} else if (fold.set) {
return E::update(gcd(fnew.togcd, fold.set));
} else
return E::GCD(gcd(fnew.togcd, fold.togcd));
}
E id() { return E(); }
R inf = 1e18;
struct Segment_Tree_Beats {
private:
int n{}, sz{}, height{};
vector<T> data;
// (id())
vector<E> lazy;
void update(int k) { data[k] = op(data[2 * k], data[2 * k + 1]); }
void push(int k) { apply_push(k); }
void apply_push(int k) {
all_apply(2 * k, lazy[k]);
all_apply(2 * k + 1, lazy[k]);
lazy[k] = id();
}
void push_apply(int k, E x) {
data[k] = mapping(x, data[k]);
lazy[k] = composition(x, lazy[k]);
}
//
void all_apply(int k, E x) {
push_apply(k, x);
if (!data[k].same) {
push(k);
update(k);
}
}
public:
Segment_Tree_Beats() = default;
explicit Segment_Tree_Beats(int n) : Segment_Tree_Beats(vector<R>(n, 0)) {}
explicit Segment_Tree_Beats(const vector<R> &v) : n(v.size()) {
sz = 1;
height = 0;
while (sz < n) sz <<= 1, height++;
data = vector<T>(2 * sz, e());
lazy = vector<E>(2 * sz, id());
build(v);
}
void build(const vector<R> &v) {
assert(n == (int)v.size());
for (int k = 0; k < n; k++) {
data[k + sz] = T(v[k]);
}
for (int k = sz - 1; k > 0; k--) update(k);
}
void set(int k, const T x) {
assert(0 <= k && k < n);
k += sz;
for (int i = height; i > 0; i--) push(k >> i);
data[k] = x;
for (int i = 1; i <= height; i++) update(k >> i);
}
T get(int k) {
assert(0 <= k && k < n);
k += sz;
for (int i = height; i > 0; i--) push(k >> i);
return data[k];
}
T operator[](int k) { return get(k); }
// i=l,...r-1mapping(x,v[i])
void apply(int l, int r, E x) {
if (l >= r) return;
l += sz;
r += sz;
// data
for (int i = height; i > 0; i--) {
if (((l >> i) << i) != l) push(l >> i);
if (((r >> i) << i) != r) push((r - 1) >> i);
}
// datalazy
int l2 = l, r2 = r;
for (; l < r; l >>= 1, r >>= 1) {
if (l & 1) all_apply(l++, x);
if (r & 1) all_apply(--r, x);
}
l = l2, r = r2;
// data
for (int i = 1; i <= height; i++) {
if (((l >> i) << i) != l) update(l >> i);
if (((r >> i) << i) != r) update((r - 1) >> i);
}
}
// op(A[l],A[l+1],...,A[r-1])
T prod(int l, int r) {
assert(0 <= l && l <= r && r <= n);
if (l >= r) return e();
l += sz;
r += sz;
// data
for (int i = height; i > 0; i--) {
if (((l >> i) << i) != l) push(l >> i);
if (((r >> i) << i) != r) push((r - 1) >> i);
}
T L = e(), R = e();
// data
for (; l < r; l >>= 1, r >>= 1) {
if (l & 1) L = op(L, data[l++]);
if (r & 1) R = op(data[--r], R);
}
return op(L, R);
}
T all_prod() const { return data[1]; }
// lcheck(op(A[l],A[l+1],...A[r]))=truer
template <typename C>
int max_right(int l, const C check) {
if (l >= n) return n;
l += sz;
for (int i = height; i > 0; i--) push(l >> i);
T sum = e();
do {
while ((l & 1) == 0) l >>= 1;
if (check(op(sum, data[l]))) {
while (l < sz) {
push(l);
l <<= 1;
auto nxt = op(sum, data[l]);
if (not check(nxt)) {
sum = nxt;
l++;
}
}
return l + 1 - sz;
}
sum = op(sum, data[l++]);
} while ((l & -l) != l);
return n;
}
// rcheck(op(A[l],A[l+1],...A[r]))=truel
template <typename C>
int min_left(int r, const C &check) {
if (r <= 0) return 0;
r += sz;
for (int i = height; i > 0; i--) push((r - 1) >> i);
T sum = e();
do {
r--;
while (r > 1 and (r & 1)) r >>= 1;
if (check(op(data[r], sum))) {
while (r < sz) {
push(r);
r = (r << 1) + 1;
auto nxt = op(data[r], sum);
if (not check(nxt)) {
sum = nxt;
r--;
}
}
return r - sz;
}
sum = op(data[r], sum);
} while ((r & -r) != r);
return 0;
}
};
} // namespace Segment_Tree_Beats_INVAl
using Segment_Tree_Beats_INVAl::Segment_Tree_Beats;
// set(k,x) A[k]=x
// get(k,x) A[k]
// prod(l,r) : op(A[l],A[l+1],...,A[r-1])
// apply(l,r,x) : i=l,...r-1mapping(x,A[i])
// max_right(l,C) :
// lcheck(op(A[l],A[l+1],...A[r]))=truer
// min_left(r, C) :
// rcheck(op(A[l],A[l+1],...A[r]))=truel
// Sdata
using ll = long long;
using vll = vector<ll>;
// https : // yukicoder.me/problems/no/880
int main() {
cin.tie(0)->sync_with_stdio(0);
cout << fixed << setprecision(20);
ll a = 0, b = 0;
ll a2, b2, c2;
ll a1 = 0, b1 = 0;
ll c = 0, c1;
ll p = 1;
ll N, M;
ll t;
ll K;
ll h, w;
ll L;
string S, T;
cin >> N >> t;
vll A(N);
for (int i = 0; i < N; i++) cin >> A[i];
// cout << A.size() << endl;
Segment_Tree_Beats seg(A);
rep(_, t) {
ll d;
cin >> a >> b >> c;
--b;
if (a == 1) {
cin >> d;
seg.apply(b, c, {0, d});
}
if (a == 2) {
cin >> d;
seg.apply(b, c, {d, 0});
}
if (a == 3) {
// cin >> d;
cout << seg.prod(b, c).Max << endl;
}
if (a == 4) {
// cin >> d;
cout << seg.prod(b, c).sum << endl;
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0