Luogu3373 【模板】线段树 2
https://www.luogu.com.cn/problem/P3373
分块
不写线段树,就是要分块!
同样需要打标记
在任何时候,\(A_i=mul_{bel_i} \times a_i+add_{bel_i}\)(\(bel_i\)表示\(i\)属于哪一块,\(A_i\)表示第\(i\)个位置的真实值)
但是由于标记都是整块整块打上去的,无法单点修改,本来可能还可以利用逆元强行修改,问题是\(p=571373\)不是质数,那么如何处理零散的数呢
很简单,因为零散的数最多分布再两块中,我们直接把那两块标记统统下传,这样就不需要考虑标记的事了
结果,\(TLE(70pts)\)。。。
\(TLE Code:\)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("-O2")
#pragma GCC optimize("-O3")
#pragma GCC optimize("inline")
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
#define N 100005
using namespace std;
int n,m,opt,x,y,p,l[N],r[N],bel[N];
int c,a[N],add[N],mul[N],s[N];
void push_down(int x)
{
for (int i=l[x];i<=r[x];i++)
a[i]=((ll)a[i]*mul[x]+add[x])%p;
add[x]=0,mul[x]=1;
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]),a[i]%=p;
int lar=(int)sqrt(n);
for (int i=1;i<=n;i++)
{
bel[i]=(i+lar-1)/lar;
if (bel[i]!=bel[i-1])
l[bel[i]]=i;
r[bel[i]]=i;
s[bel[i]]=(s[bel[i]]+a[i])%p;
}
for (int i=1;i<=bel[n];i++)
add[i]=0,mul[i]=1;
while (m --> 0)
{
scanf("%d%d%d",&opt,&x,&y);
int rx=bel[x],ry=bel[y];
if (opt==1)
{
scanf("%d",&c);
if (rx==ry)
{
push_down(rx);
for (int i=x;i<=y;i++)
s[rx]=((ll)s[rx]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
continue;
}
push_down(rx),push_down(ry);
for (int i=x;i<=r[rx];i++)
s[rx]=((ll)s[rx]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
for (int i=rx+1;i<=ry-1;i++)
add[i]=(ll)add[i]*c%p,mul[i]=(ll)mul[i]*c%p,s[i]=(ll)s[i]*c%p;
for (int i=l[ry];i<=y;i++)
s[ry]=((ll)s[ry]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
} else
if (opt==2)
{
scanf("%d",&c);
if (rx==ry)
{
push_down(rx);
for (int i=x;i<=y;i++)
a[i]=(a[i]+c)%p;
s[rx]=((ll)s[rx]+(ll)c*(y-x+1))%p;
continue;
}
push_down(rx),push_down(ry);
for (int i=x;i<=r[rx];i++)
a[i]=(a[i]+c)%p;
s[rx]=((ll)s[rx]+(ll)c*(r[rx]-x+1))%p;
for (int i=rx+1;i<=ry-1;i++)
add[i]=(add[i]+c)%p,s[i]=((ll)s[i]+(ll)c*(r[i]-l[i]+1))%p;
for (int i=l[ry];i<=y;i++)
a[i]=(a[i]+c)%p;
s[ry]=((ll)s[ry]+(ll)c*(y-l[ry]+1))%p;
} else
{
int ans=0;
if (rx==ry)
{
for (int i=x;i<=y;i++)
ans=((ll)ans+(ll)mul[rx]*a[i]+add[rx])%p;
ans=(ans%p+p)%p;
printf("%d\n",ans);
continue;
}
for (int i=x;i<=r[rx];i++)
ans=((ll)ans+(ll)mul[rx]*a[i]+add[rx])%p;
for (int i=rx+1;i<=ry-1;i++)
ans=(ans+s[i])%p;
for (int i=l[ry];i<=y;i++)
ans=((ll)ans+(ll)mul[ry]*a[i]+add[ry])%p;
ans=(ans%p+p)%p;
printf("%d\n",ans);
}
}
return 0;
}
怎么办,先寻找可以减小计算量的地方进行优化,发现依旧\(TLE\)
终极操作:循环展开!
\(AC!\),总用时\(2.54s\),最大点\(950ms\)
于是代码不堪入目
\(Code:\)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("-O2")
#pragma GCC optimize("-O3")
#pragma GCC optimize("inline")
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
#define N 100005
using namespace std;
int n,m,opt,x,y,p,l[N],r[N],len[N],bel[N];
int lx,wx,qx,qy,g;
int c,a[N],add[N],mul[N],s[N];
int read()
{
int S=0;
char c=getchar();
while (c<'0' || c>'9')
c=getchar();
while ('0'<=c && c<='9')
{
S=S*10+c-'0';
c=getchar();
}
return S;
}
void write(int x)
{
if (x>9)
write(x/10);
putchar(x%10+'0');
}
void push_down(int x)
{
if (l[x]/10==r[x]/10)
{
for (int i=l[x];i<=r[x];i++)
a[i]=((ll)a[i]*mul[x]+add[x])%p;
add[x]=0,mul[x]=1;
return;
}
int lx=l[x]/10*10+10;
int wx=r[x]/10*10;
int g=(wx-lx)/10;
for (int i=l[x];i<=lx;i++)
a[i]=((ll)a[i]*mul[x]+add[x])%p;
for (int i=wx+1;i<=r[x];i++)
a[i]=((ll)a[i]*mul[x]+add[x])%p;
for (int i=1;i<=g;i++)
{
a[lx+1]=((ll)a[lx+1]*mul[x]+add[x])%p;
a[lx+2]=((ll)a[lx+2]*mul[x]+add[x])%p;
a[lx+3]=((ll)a[lx+3]*mul[x]+add[x])%p;
a[lx+4]=((ll)a[lx+4]*mul[x]+add[x])%p;
a[lx+5]=((ll)a[lx+5]*mul[x]+add[x])%p;
a[lx+6]=((ll)a[lx+6]*mul[x]+add[x])%p;
a[lx+7]=((ll)a[lx+7]*mul[x]+add[x])%p;
a[lx+8]=((ll)a[lx+8]*mul[x]+add[x])%p;
a[lx+9]=((ll)a[lx+9]*mul[x]+add[x])%p;
a[lx+10]=((ll)a[lx+10]*mul[x]+add[x])%p;
lx+=10;
}
add[x]=0,mul[x]=1;
}
int main()
{
n=read(),m=read(),p=read();
for (int i=1;i<=n;i++)
a[i]=read(),a[i]%=p;
int lar=(int)pow(n,0.47);
for (int i=1;i<=n;i++)
{
bel[i]=(i+lar-1)/lar;
if (bel[i]!=bel[i-1])
l[bel[i]]=i;
r[bel[i]]=i;
s[bel[i]]=(s[bel[i]]+a[i])%p;
}
for (int i=1;i<=bel[n];i++)
add[i]=0,mul[i]=1,len[i]=r[i]-l[i]+1;
while (m --> 0)
{
opt=read(),x=read(),y=read();
int rx=bel[x],ry=bel[y];
if (opt==1)
{
c=read();
if (rx==ry)
{
if (x==l[rx] && y==r[rx])
{
add[rx]=(ll)add[rx]*c%p,mul[rx]=(ll)mul[rx]*c%p,s[rx]=(ll)s[rx]*c%p;
continue;
}
push_down(rx);
qx=x,qy=y;
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
s[rx]=((ll)s[rx]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
continue;
}
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
s[rx]=((ll)s[rx]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
for (int i=wx+1;i<=qy;i++)
s[rx]=((ll)s[rx]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
for (int i=1;i<=g;i++)
{
s[rx]=((ll)s[rx]+(ll)a[lx+1]*(c-1)%p),a[lx+1]=(ll)a[lx+1]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+2]*(c-1)%p),a[lx+2]=(ll)a[lx+2]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+3]*(c-1)%p),a[lx+3]=(ll)a[lx+3]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+4]*(c-1)%p),a[lx+4]=(ll)a[lx+4]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+5]*(c-1)%p),a[lx+5]=(ll)a[lx+5]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+6]*(c-1)%p),a[lx+6]=(ll)a[lx+6]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+7]*(c-1)%p),a[lx+7]=(ll)a[lx+7]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+8]*(c-1)%p),a[lx+8]=(ll)a[lx+8]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+9]*(c-1)%p),a[lx+9]=(ll)a[lx+9]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+10]*(c-1)%p),a[lx+10]=(ll)a[lx+10]*c%p;
lx+=10;
}
continue;
}
if (x!=l[rx])
{
push_down(rx);
qx=x,qy=r[rx];
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
s[rx]=((ll)s[rx]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
s[rx]=((ll)s[rx]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
for (int i=wx+1;i<=qy;i++)
s[rx]=((ll)s[rx]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
for (int i=1;i<=g;i++)
{
s[rx]=((ll)s[rx]+(ll)a[lx+1]*(c-1)%p),a[lx+1]=(ll)a[lx+1]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+2]*(c-1)%p),a[lx+2]=(ll)a[lx+2]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+3]*(c-1)%p),a[lx+3]=(ll)a[lx+3]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+4]*(c-1)%p),a[lx+4]=(ll)a[lx+4]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+5]*(c-1)%p),a[lx+5]=(ll)a[lx+5]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+6]*(c-1)%p),a[lx+6]=(ll)a[lx+6]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+7]*(c-1)%p),a[lx+7]=(ll)a[lx+7]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+8]*(c-1)%p),a[lx+8]=(ll)a[lx+8]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+9]*(c-1)%p),a[lx+9]=(ll)a[lx+9]*c%p;
s[rx]=((ll)s[rx]+(ll)a[lx+10]*(c-1)%p),a[lx+10]=(ll)a[lx+10]*c%p;
lx+=10;
}
}
rx++;
}
if (y!=r[ry])
{
push_down(ry);
qx=l[ry],qy=y;
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
s[ry]=((ll)s[ry]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
s[ry]=((ll)s[ry]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
for (int i=wx+1;i<=qy;i++)
s[ry]=((ll)s[ry]+(ll)a[i]*(c-1)%p),a[i]=(ll)a[i]*c%p;
for (int i=1;i<=g;i++)
{
s[ry]=((ll)s[ry]+(ll)a[lx+1]*(c-1)%p),a[lx+1]=(ll)a[lx+1]*c%p;
s[ry]=((ll)s[ry]+(ll)a[lx+2]*(c-1)%p),a[lx+2]=(ll)a[lx+2]*c%p;
s[ry]=((ll)s[ry]+(ll)a[lx+3]*(c-1)%p),a[lx+3]=(ll)a[lx+3]*c%p;
s[ry]=((ll)s[ry]+(ll)a[lx+4]*(c-1)%p),a[lx+4]=(ll)a[lx+4]*c%p;
s[ry]=((ll)s[ry]+(ll)a[lx+5]*(c-1)%p),a[lx+5]=(ll)a[lx+5]*c%p;
s[ry]=((ll)s[ry]+(ll)a[lx+6]*(c-1)%p),a[lx+6]=(ll)a[lx+6]*c%p;
s[ry]=((ll)s[ry]+(ll)a[lx+7]*(c-1)%p),a[lx+7]=(ll)a[lx+7]*c%p;
s[ry]=((ll)s[ry]+(ll)a[lx+8]*(c-1)%p),a[lx+8]=(ll)a[lx+8]*c%p;
s[ry]=((ll)s[ry]+(ll)a[lx+9]*(c-1)%p),a[lx+9]=(ll)a[lx+9]*c%p;
s[ry]=((ll)s[ry]+(ll)a[lx+10]*(c-1)%p),a[lx+10]=(ll)a[lx+10]*c%p;
lx+=10;
}
}
ry--;
}
if (rx>ry)
continue;
qx=rx,qy=ry;
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
add[i]=(ll)add[i]*c%p,mul[i]=(ll)mul[i]*c%p,s[i]=(ll)s[i]*c%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
add[i]=(ll)add[i]*c%p,mul[i]=(ll)mul[i]*c%p,s[i]=(ll)s[i]*c%p;
for (int i=wx+1;i<=qy;i++)
add[i]=(ll)add[i]*c%p,mul[i]=(ll)mul[i]*c%p,s[i]=(ll)s[i]*c%p;
for (int i=1;i<=g;i++)
{
add[lx+1]=(ll)add[lx+1]*c%p,mul[lx+1]=(ll)mul[lx+1]*c%p,s[lx+1]=(ll)s[lx+1]*c%p;
add[lx+2]=(ll)add[lx+2]*c%p,mul[lx+2]=(ll)mul[lx+2]*c%p,s[lx+2]=(ll)s[lx+2]*c%p;
add[lx+3]=(ll)add[lx+3]*c%p,mul[lx+3]=(ll)mul[lx+3]*c%p,s[lx+3]=(ll)s[lx+3]*c%p;
add[lx+4]=(ll)add[lx+4]*c%p,mul[lx+4]=(ll)mul[lx+4]*c%p,s[lx+4]=(ll)s[lx+4]*c%p;
add[lx+5]=(ll)add[lx+5]*c%p,mul[lx+5]=(ll)mul[lx+5]*c%p,s[lx+5]=(ll)s[lx+5]*c%p;
add[lx+6]=(ll)add[lx+6]*c%p,mul[lx+6]=(ll)mul[lx+6]*c%p,s[lx+6]=(ll)s[lx+6]*c%p;
add[lx+7]=(ll)add[lx+7]*c%p,mul[lx+7]=(ll)mul[lx+7]*c%p,s[lx+7]=(ll)s[lx+7]*c%p;
add[lx+8]=(ll)add[lx+8]*c%p,mul[lx+8]=(ll)mul[lx+8]*c%p,s[lx+8]=(ll)s[lx+8]*c%p;
add[lx+9]=(ll)add[lx+9]*c%p,mul[lx+9]=(ll)mul[lx+9]*c%p,s[lx+9]=(ll)s[lx+9]*c%p;
add[lx+10]=(ll)add[lx+10]*c%p,mul[lx+10]=(ll)mul[lx+10]*c%p,s[lx+10]=(ll)s[lx+10]*c%p;
lx+=10;
}
}
} else
if (opt==2)
{
c=read();
if (rx==ry)
{
if (x==l[rx] && y==r[rx])
{
add[rx]=(add[rx]+c)%p,s[rx]=((ll)s[rx]+(ll)c*(r[rx]-l[rx]+1))%p;
continue;
}
push_down(rx);
qx=x,qy=y;
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
a[i]=(a[i]+c)%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
a[i]=(a[i]+c)%p;
for (int i=wx+1;i<=qy;i++)
a[i]=(a[i]+c)%p;
for (int i=1;i<=g;i++)
{
a[lx+1]=(a[lx+1]+c)%p;
a[lx+2]=(a[lx+2]+c)%p;
a[lx+3]=(a[lx+3]+c)%p;
a[lx+4]=(a[lx+4]+c)%p;
a[lx+5]=(a[lx+5]+c)%p;
a[lx+6]=(a[lx+6]+c)%p;
a[lx+7]=(a[lx+7]+c)%p;
a[lx+8]=(a[lx+8]+c)%p;
a[lx+9]=(a[lx+9]+c)%p;
a[lx+10]=(a[lx+10]+c)%p;
lx+=10;
}
}
s[rx]=((ll)s[rx]+(ll)c*(y-x+1))%p;
continue;
}
if (x!=l[rx])
{
push_down(rx);
qx=x,qy=r[rx];
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
a[i]=(a[i]+c)%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
a[i]=(a[i]+c)%p;
for (int i=wx+1;i<=qy;i++)
a[i]=(a[i]+c)%p;
for (int i=1;i<=g;i++)
{
a[lx+1]=(a[lx+1]+c)%p;
a[lx+2]=(a[lx+2]+c)%p;
a[lx+3]=(a[lx+3]+c)%p;
a[lx+4]=(a[lx+4]+c)%p;
a[lx+5]=(a[lx+5]+c)%p;
a[lx+6]=(a[lx+6]+c)%p;
a[lx+7]=(a[lx+7]+c)%p;
a[lx+8]=(a[lx+8]+c)%p;
a[lx+9]=(a[lx+9]+c)%p;
a[lx+10]=(a[lx+10]+c)%p;
lx+=10;
}
}
s[rx]=((ll)s[rx]+(ll)c*(r[rx]-x+1))%p;
rx++;
}
if (y!=r[ry])
{
push_down(ry);
qx=l[ry],qy=y;
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
a[i]=(a[i]+c)%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
a[i]=(a[i]+c)%p;
for (int i=wx+1;i<=qy;i++)
a[i]=(a[i]+c)%p;
for (int i=1;i<=g;i++)
{
a[lx+1]=(a[lx+1]+c)%p;
a[lx+2]=(a[lx+2]+c)%p;
a[lx+3]=(a[lx+3]+c)%p;
a[lx+4]=(a[lx+4]+c)%p;
a[lx+5]=(a[lx+5]+c)%p;
a[lx+6]=(a[lx+6]+c)%p;
a[lx+7]=(a[lx+7]+c)%p;
a[lx+8]=(a[lx+8]+c)%p;
a[lx+9]=(a[lx+9]+c)%p;
a[lx+10]=(a[lx+10]+c)%p;
lx+=10;
}
}
s[ry]=((ll)s[ry]+(ll)c*(y-l[ry]+1))%p;
ry--;
}
if (rx>ry)
continue;
qx=rx,qy=ry;
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
add[i]=(add[i]+c)%p,s[i]=((ll)s[i]+(ll)c*len[i])%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
add[i]=(add[i]+c)%p,s[i]=((ll)s[i]+(ll)c*len[i])%p;
for (int i=wx+1;i<=qy;i++)
add[i]=(add[i]+c)%p,s[i]=((ll)s[i]+(ll)c*len[i])%p;
for (int i=1;i<=g;i++)
{
add[lx+1]=(add[lx+1]+c)%p,s[lx+1]=((ll)s[lx+1]+(ll)c*len[lx+1])%p;
add[lx+2]=(add[lx+2]+c)%p,s[lx+2]=((ll)s[lx+2]+(ll)c*len[lx+2])%p;
add[lx+3]=(add[lx+3]+c)%p,s[lx+3]=((ll)s[lx+3]+(ll)c*len[lx+3])%p;
add[lx+4]=(add[lx+4]+c)%p,s[lx+4]=((ll)s[lx+4]+(ll)c*len[lx+4])%p;
add[lx+5]=(add[lx+5]+c)%p,s[lx+5]=((ll)s[lx+5]+(ll)c*len[lx+5])%p;
add[lx+6]=(add[lx+6]+c)%p,s[lx+6]=((ll)s[lx+6]+(ll)c*len[lx+6])%p;
add[lx+7]=(add[lx+7]+c)%p,s[lx+7]=((ll)s[lx+7]+(ll)c*len[lx+7])%p;
add[lx+8]=(add[lx+8]+c)%p,s[lx+8]=((ll)s[lx+8]+(ll)c*len[lx+8])%p;
add[lx+9]=(add[lx+9]+c)%p,s[lx+9]=((ll)s[lx+9]+(ll)c*len[lx+9])%p;
add[lx+10]=(add[lx+10]+c)%p,s[lx+10]=((ll)s[lx+10]+(ll)c*len[lx+10])%p;
lx+=10;
}
}
} else
{
int ans=0;
if (rx==ry)
{
if (x==l[rx] && y==r[rx])
{
write(s[rx]),putchar('\n');
continue;
}
qx=x,qy=y;
ans=(ans+(ll)add[rx]*(qy-qx+1)%p);
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
ans=((ll)ans+(ll)mul[rx]*a[i])%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
ans=((ll)ans+(ll)mul[rx]*a[i])%p;
for (int i=wx+1;i<=qy;i++)
ans=((ll)ans+(ll)mul[rx]*a[i])%p;
for (int i=1;i<=g;i++)
{
ans=((ll)ans+(ll)mul[rx]*a[lx+1])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+2])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+3])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+4])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+5])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+6])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+7])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+8])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+9])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+10])%p;
lx+=10;
}
}
ans=(ans%p+p)%p;
write(ans),putchar('\n');
continue;
}
if (x!=l[rx])
{
qx=x,qy=r[rx];
ans=((ll)ans+(ll)add[rx]*(qy-qx+1))%p;
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
ans=((ll)ans+(ll)mul[rx]*a[i])%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
ans=((ll)ans+(ll)mul[rx]*a[i])%p;
for (int i=wx+1;i<=qy;i++)
ans=((ll)ans+(ll)mul[rx]*a[i])%p;
for (int i=1;i<=g;i++)
{
ans=((ll)ans+(ll)mul[rx]*a[lx+1])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+2])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+3])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+4])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+5])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+6])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+7])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+8])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+9])%p;
ans=((ll)ans+(ll)mul[rx]*a[lx+10])%p;
lx+=10;
}
}
rx++;
}
if (y!=r[ry])
{
qx=l[ry],qy=y;
ans=((ll)ans+(ll)add[ry]*(qy-qx+1))%p;
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
ans=((ll)ans+(ll)mul[ry]*a[i])%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
ans=((ll)ans+(ll)mul[ry]*a[i])%p;
for (int i=wx+1;i<=qy;i++)
ans=((ll)ans+(ll)mul[ry]*a[i])%p;
for (int i=1;i<=g;i++)
{
ans=((ll)ans+(ll)mul[ry]*a[lx+1])%p;
ans=((ll)ans+(ll)mul[ry]*a[lx+2])%p;
ans=((ll)ans+(ll)mul[ry]*a[lx+3])%p;
ans=((ll)ans+(ll)mul[ry]*a[lx+4])%p;
ans=((ll)ans+(ll)mul[ry]*a[lx+5])%p;
ans=((ll)ans+(ll)mul[ry]*a[lx+6])%p;
ans=((ll)ans+(ll)mul[ry]*a[lx+7])%p;
ans=((ll)ans+(ll)mul[ry]*a[lx+8])%p;
ans=((ll)ans+(ll)mul[ry]*a[lx+9])%p;
ans=((ll)ans+(ll)mul[ry]*a[lx+10])%p;
lx+=10;
}
}
ry--;
}
if (rx>ry)
{
ans=(ans%p+p)%p;
write(ans),putchar('\n');
continue;
}
qx=rx,qy=ry;
if (qx/10==qy/10)
{
for (int i=qx;i<=qy;i++)
ans=(ans+s[i])%p;
} else
{
lx=qx/10*10+10;
wx=qy/10*10;
g=(wx-lx)/10;
for (int i=qx;i<=lx;i++)
ans=(ans+s[i])%p;
for (int i=wx+1;i<=qy;i++)
ans=(ans+s[i])%p;
for (int i=1;i<=g;i++)
{
ans=(ans+s[lx+1]+s[lx+2]+s[lx+3]+s[lx+4]+s[lx+5]+s[lx+6]+s[lx+7]+s[lx+8]+s[lx+9]+s[lx+10])%p;
lx+=10;
}
}
ans=(ans%p+p)%p;
write(ans),putchar('\n');
}
}
return 0;
}