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;
}
posted @ 2020-09-09 20:34  GK0328  阅读(114)  评论(0编辑  收藏  举报