Luogu3373 【模板】線段樹 2
阿新 • • 發佈:2020-09-09
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; }