提交时间:2025-03-02 14:10:01

运行 ID: 37039

#include <bits/stdc++.h> #define int unsigned long long using namespace std; int n, q, k; int a[300005]; __int128_t t[2400005], t1[2400005], t2[2400005]; #define root 1,1,n #define ls (x << 1) #define rs (x << 1 | 1) #define mid ((l + r) >> 1) inline void pu(int x) { t[x] = t[ls] + t[rs]; } __int128_t mod = ((__int128_t)1) << 64; inline void pd(int x, int l, int r) { t[ls] *= t2[x], t[rs] *= t2[x]; t[ls] += t1[x] * (mid - l + 1), t[rs] += t1[x] * (r - mid); t2[ls] *= t2[x], t2[rs] *= t2[x]; t1[ls] += t1[x], t1[rs] += t1[x]; t1[ls] %= mod, t1[rs] %= mod, t2[ls] %= mod, t2[rs] %= mod, t[ls] %= mod, t[rs] %= mod; t1[x] = 0, t2[x] = 1; } inline void bd(int x, int l, int r) { if (l == r) { t2[x] = 1; return ; } t2[x] = 1; bd(ls, l, mid); bd(rs, mid + 1, r); } inline void add(int x, int l, int r, int ql, int qr, int k) { pd(x, l, r); if (ql <= l && r <= qr) { t[x] += (r - l + 1) * k; t1[x] += k; return ; } if (ql <= mid) add(ls, l, mid, ql, qr, k); if (qr > mid) add(rs, mid + 1, r, ql, qr, k); pu(x); } inline void mul(int x, int l, int r, int ql, int qr, int k) { pd(x, l, r); if (ql <= l && r <= qr) { t[x] *= k; t2[x] *= k; t1[x] *= k; return ; } if (ql <= mid) add(ls, l, mid, ql, qr, k); if (qr > mid) add(rs, mid + 1, r, ql, qr, k); pu(x); } inline void div(int x, int l, int r, int ql, int qr) { if (l == r) { t[x] = floor(t[x] / 2.0); return ; } pd(x, l, r); if (ql <= mid) div(ls, l, mid, ql, qr); if (qr > mid) div(rs, mid + 1, r, ql, qr); pu(x); } inline int qry(int x, int l, int r, int q) { if (l == r) return t[x]; pd(x, l, r); if (q <= mid) return qry(ls, l, mid, q); return qry(rs, mid + 1, r, q); } signed main() { // freopen("calculator.in", "r", stdin); // freopen("calculator.out", "w", stdout); int c; scanf("%lld", &c); scanf("%lld %lld %lld", &n, &q, &k); if (c > 5) { for (int i = 1; i <= n; i++) { printf("0 "); } return 0; } while (q--) { char c; getchar(); c = getchar(); int x, y, z; scanf("%lld %lld", &x, &y); if (c == '+' || c == '-') { scanf("%lld", &z); if (c == '-') z = -z; add(root, x, y, z); } else if (c == '*') { scanf("%lld" , &z); mul(root, x, y, z); } else { div(root, x, y); } } for (int i = 1; i <= n; i++) { int val = qry(root, i) % 2; if (val < 0) val = -val; printf("%lld ", val); } return 0; }