提出 #48476989
ソースコード 拡げる
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 998244353;
struct segTree{
vector<ll> val, cnt, mult, sum;
int size;
void build(int x, int lx, int rx, vector<int>& a){
if(rx - lx == 1){
if(lx < (int)a.size()){
cnt[x] = 1;
val[x] = a[lx];
}
return;
}
int m = (lx + rx) / 2;
build(2 * x + 1, lx, m, a);
build(2 * x + 2, m, rx, a);
cnt[x] = cnt[2 * x + 1] + cnt[2 * x + 2];
val[x] = val[2 * x + 1] + val[2 * x + 2];
}
void init(vector<int>& a){
int n = (int)a.size();
size = 1;
while(size < n) size *= 2;
val.assign(2 * size, 0);
cnt.assign(2 * size, 0);
mult.assign(2 * size, 1);
sum.assign(2 * size, 0);
build(0, 0, size, a);
}
void push(int x){
if(2 * x + 2 >= (int)val.size()) return;
val[2 * x + 1] *= mult[x]; val[2 * x + 1] += sum[x] * cnt[2 * x + 1]; val[2 * x + 1] %= MOD;
val[2 * x + 2] *= mult[x]; val[2 * x + 2] += sum[x] * cnt[2 * x + 2]; val[2 * x + 2] %= MOD;
mult[2 * x + 1] *= mult[x]; mult[2 * x + 1] %= MOD; sum[2 * x + 1] *= mult[x]; sum[2 * x + 1] += sum[x]; sum[2 * x + 1] %= MOD;
mult[2 * x + 2] *= mult[x]; mult[2 * x + 2] %= MOD; sum[2 * x + 2] *= mult[x]; sum[2 * x + 2] += sum[x]; sum[2 * x + 2] %= MOD;
mult[x] = 1;
sum[x] = 0;
}
void set(int l, int r, ll u, int type, int x, int lx, int rx){
if(lx >= l && rx <= r){
if(type == 1) {val[x] *= u; mult[x] *= u; sum[x] *= u;}
else {val[x] += u * (rx - lx); sum[x] += u;}
val[x] %= MOD; mult[x] %= MOD; sum[x] %= MOD;
return;
}else if(lx >= r || rx <= l) return;
int m = (lx + rx) / 2;
push(x);
set(l, r, u, type, 2 * x + 1, lx, m);
set(l, r, u, type, 2 * x + 2, m, rx);
val[x] = val[2 * x + 1] + val[2 * x + 2];
val[x] %= MOD;
}
void set(int l, int r, ll u, int type){ //Type = 1, multiplication. Type = 2, sum.
set(l, r, u, type, 0, 0, size);
}
ll query(int l, int r, int x, int lx, int rx){
if(lx >= l && rx <= r) return val[x];
else if(lx >= r || rx <= l) return 0;
int m = (lx + rx) / 2;
push(x);
ll s1 = query(l, r, 2 * x + 1, lx, m);
ll s2 = query(l, r, 2 * x + 2, m, rx);
return (s1 + s2) % MOD;
}
ll query(int l, int r){
return query(l, r, 0, 0, size);
}
};
ll binpow(ll a, ll b, int mod = MOD){
if(!b) return 1;
else if(b % 2 == 0){
ll x = binpow(a, b / 2, mod);
return (x * x) % mod;
}else{
ll x = binpow(a, b / 2, mod);
return (((x * x) % mod) * a) % mod;
}
}
ll inv(ll x, ll mod = MOD){
x %= mod;
return binpow(x, mod - 2, mod);
}
void solve(){
int n, q; cin >> n >> q;
vector<int> a(n);
for(auto &i : a) cin >> i;
segTree st; st.init(a);
while(q--){
int l, r, X; cin >> l >> r >> X; l--; r--;
ll size = (r - l + 1);
st.set(l, r + 1, ((size - 1) * inv(size)) % MOD, 1);
st.set(l, r + 1, (X * inv(size)) % MOD, 2);
}
for(int i = 0; i < n; i++) cout << st.query(i, i + 1) << " ";
cout << "\n";
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
}
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
550 / 550 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
example0.txt, example1.txt, example2.txt |
| All |
000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, example0.txt, example1.txt, example2.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 000.txt |
AC |
100 ms |
3456 KiB |
| 001.txt |
AC |
334 ms |
20216 KiB |
| 002.txt |
AC |
336 ms |
20144 KiB |
| 003.txt |
AC |
332 ms |
20200 KiB |
| 004.txt |
AC |
391 ms |
20212 KiB |
| 005.txt |
AC |
392 ms |
20176 KiB |
| 006.txt |
AC |
394 ms |
20228 KiB |
| 007.txt |
AC |
294 ms |
20264 KiB |
| 008.txt |
AC |
296 ms |
20144 KiB |
| 009.txt |
AC |
295 ms |
20184 KiB |
| 010.txt |
AC |
505 ms |
20212 KiB |
| 011.txt |
AC |
506 ms |
20224 KiB |
| 012.txt |
AC |
506 ms |
20380 KiB |
| 013.txt |
AC |
550 ms |
20212 KiB |
| 014.txt |
AC |
558 ms |
20384 KiB |
| 015.txt |
AC |
436 ms |
11816 KiB |
| 016.txt |
AC |
177 ms |
4108 KiB |
| 017.txt |
AC |
166 ms |
20192 KiB |
| 018.txt |
AC |
251 ms |
20200 KiB |
| 019.txt |
AC |
314 ms |
7352 KiB |
| 020.txt |
AC |
247 ms |
11732 KiB |
| 021.txt |
AC |
177 ms |
5236 KiB |
| 022.txt |
AC |
133 ms |
11768 KiB |
| 023.txt |
AC |
249 ms |
11836 KiB |
| 024.txt |
AC |
180 ms |
7272 KiB |
| 025.txt |
AC |
570 ms |
20176 KiB |
| 026.txt |
AC |
567 ms |
20248 KiB |
| 027.txt |
AC |
570 ms |
20216 KiB |
| 028.txt |
AC |
560 ms |
20176 KiB |
| 029.txt |
AC |
568 ms |
20268 KiB |
| 030.txt |
AC |
561 ms |
20180 KiB |
| 031.txt |
AC |
562 ms |
20244 KiB |
| 032.txt |
AC |
561 ms |
20204 KiB |
| 033.txt |
AC |
565 ms |
20140 KiB |
| 034.txt |
AC |
565 ms |
20272 KiB |
| 035.txt |
AC |
550 ms |
20196 KiB |
| example0.txt |
AC |
1 ms |
3392 KiB |
| example1.txt |
AC |
1 ms |
3448 KiB |
| example2.txt |
AC |
1 ms |
3608 KiB |