#include<bits/stdc++.h>
using namespace std;
const int mod = 998244353;
int tr[10][100005];
int tag[10][100005];
int jin[100005];
int mu[100005];
int shui[100005];
int huo[100005];
int tu[100005];
int n;
int m;
void build(int k, int l, int r)
{
tag[1][k] = 0;
tag[2][k] = 0;
tag[3][k] = 0;
tag[4][k] = 0;
tag[5][k] = 0;
if(l == r)
{
tr[1][k] = jin[l];
tr[2][k] = mu[l];
tr[3][k] = shui[l];
tr[4][k] = huo[l];
tr[5][k] = tu[l];
return;
}
int mid = l+r>>1;
build(k<<1, l, mid);
build(k<<1|1, mid+1, r);
tr[1][k] = tr[1][k<<1]+tr[1][k<<1|1]%mod;
tr[2][k] = tr[2][k<<1]+tr[2][k<<1|1]%mod;
tr[3][k] = tr[3][k<<1]+tr[3][k<<1|1]%mod;
tr[4][k] = tr[4][k<<1]+tr[4][k<<1|1]%mod;
tr[5][k] = tr[5][k<<1]+tr[5][k<<1|1]%mod;
}
void add(int k, int l, int r, int v, int z)
{
tag[z][k] += v%mod;
tr[z][k] += (r-l+1)*v%mod;
return;
}
void pushdown(int k, int l, int r, int mid, int z)
{
if(tag[z][k] == 0)
{
return;
}
add(k<<1,l,mid,tag[z][k],z);
add(k<<1|1,mid+1,r,tag[z][k],z);
tag[z][k] = 0;
}
void Add(int k, int l, int r, int x, int y, int v, int z)
{
if(l>=x&&r<=y)
{
return add(k,l,r,v,z);
}
int mid = l+r>>1;
pushdown(k, l, r, mid, z);
if(x<=mid)
{
Add(k<<1,l,mid,x,y,v,z);
}
if(mid<y)
{
Add(k<<1|1,mid+1,r,x,y,v,z);
}
tr[z][k] = tr[z][k<<1]+tr[z][k<<1|1]%mod;
return;
}
int q(int k, int l, int r, int x, int y)
{
cout<<l<<' '<<r<<":"<<tr[1][k]*tr[2][k]%mod*tr[3][k]%mod*tr[4][k]%mod*tr[5][k]%mod<<endl;
if(l>=x&&r<=y)
{
return tr[1][k]*tr[2][k]%mod*tr[3][k]%mod*tr[4][k]%mod*tr[5][k]%mod;
}
int mid = l+r>>1;
int res = 0;
pushdown(k,l,r,mid,1);
pushdown(k,l,r,mid,2);
pushdown(k,l,r,mid,3);
pushdown(k,l,r,mid,4);
pushdown(k,l,r,mid,5);
if(x<=mid)
{
res+=q(k<<1,l,mid,x,y)%mod;
}
if(mid<y)
{
res+=q(k<<1|1,mid+1,r,x,y)%mod;
}
return res%mod;
}
int main()
{
cin>>n;
for(int i = 1; i<=n; i++)
{
cin>>jin[i]>>mu[i]>>shui[i]>>huo[i]>>tu[i];
}
build(1,1,n);
cin>>m;
for(int i = 1; i<=m; i++)
{
char op;
int l;
int r;
cin>>op>>l>>r;
if(op == 'J')
{
int x;
cin>>x;
Add(1,1,n,l,r,x,1);
}
if(op == 'M')
{
int x;
cin>>x;
Add(1,1,n,l,r,x,2);
}
if(op == 'S')
{
int x;
cin>>x;
Add(1,1,n,l,r,x,3);
}
if(op == 'H')
{
int x;
cin>>x;
Add(1,1,n,l,r,x,4);
}
if(op == 'T')
{
int x;
cin>>x;
Add(1,1,n,l,r,x,5);
}
if(op == 'Q')
{
cout<<q(1,1,n,l,r)<<endl;
}
}
return 0;
}
魔法阵(样例没过,输出7200)
2024-03-31 21:01:58 By dfdf_maoshenxing