真晕了,有没有大佬帮看一下为什么超时啊
F题
#include<bits/stdc++.h>
#define ls 2*i
#define rs 2*i+1
using namespace std;
const int mod=998244353;
const int N=210011;
int v[N];
array<int,7>tree[N<<2];
bool flag[N<<2];
struct mt{
int a[7][7]={0};
mt(){}
void fc(){
for(int i=0;i<7;i++)for(int j=0;j<7;j++){
a[i][j]=(i==j);
}
}
mt(int op,int tk){
vector<int>x(6);
x[0]=1;
for(int i=1;i<6;i++){
x[i]=x[i-1]*tk%mod;
}
if(op==1){//加
int tp[7][7]={
{1,x[1],x[2],x[3],x[4],x[5],0},
{0,1,2*x[1],3*x[2],4*x[3],5*x[4],0},
{0,0,1,3*x[1],6*x[2],10*x[3],0},
{0,0,0,1,4*x[1],10*x[2],0},
{0,0,0,0,1,5*x[1],0},
{0,0,0,0,0,1,0},
{0,0,0,0,0,0,1}
};
for(int i=0;i<7;i++)for(int j=0;j<7;j++){
a[i][j]=tp[i][j];
}
}else if(op==2){//乘
for(int i=0;i<6;i++){
a[i][i]=x[i];
}
a[6][6]=1;
}else if(op==3){
for(int i=0;i<7;i++){
a[i][i]=1;
}
for(int i=1;i<7;i++){
a[i][6]=1;
}
}
}
mt operator *(const mt& b)const{
mt ans;
for(int i=0;i<7;i++)for(int j=0;j<7;j++){
for(int k=0;k<7;k++){
ans.a[i][j]+=1ll*a[i][k]*b.a[k][j]%mod;
ans.a[i][j]%=mod;
}
}
return ans;
}
}tag[N<<2];
array<int,7>cheng(array<int,7>&a,mt& b){
array<int,7>ans={0};
for(int i=0;i<7;i++){
for(int j=0;j<7;j++){
ans[i]+=1ll*a[j]*b.a[j][i]%mod;
ans[i]%=mod;
}
}
return ans;
}
void build(int l,int r,int i){
tag[i].fc();
if(l==r){
int tp=v[l];int val=1;
for(int j=0;j<=5;j++){
tree[i][j]=val;
val=1ll*val*tp%mod;
}
tree[i][6]=0;
}else{
int mid=(l+r)/2;
build(l,mid,ls);
build(mid+1,r,rs);
}
}
void lazy(int i,mt& tp){
flag[i]=1;
tag[i]=tag[i]*tp;
tree[i]=cheng(tree[i],tp);
}
void down(int i){
if(flag[i]){
lazy(ls,tag[i]);
lazy(rs,tag[i]);
tag[i].fc();
flag[i]=0;
}
}
void add(int tl,int tr,mt&tp,int l,int r,int i){
if(tl<=l&&r<=tr){
lazy(i,tp);
}else{
int mid=(l+r)/2;
down(i);
if(mid>=tl)
add(tl,tr,tp,l,mid,ls);
if(mid<tr)
add(tl,tr,tp,mid+1,r,rs);
}
}
void query(int l,int r,int i){
if(l==r){
cout<<tree[i][6]<<" ";
}else{
int mid=(l+r)/2;
down(i);
query(l,mid,ls);
query(mid+1,r,rs);
}
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i];
}
build(1,n,1);
mt nm(3,0);
while(m--){
int op,l,r,x;cin>>op>>l>>r>>x;
mt tp(op,x);
if(op==1){
add(l,r,tp,1,n,1);
}else {
add(l,r,tp,1,n,1);
}
add(1,n,nm,1,n,1);
}
query(1,n,1);
}
