最后一个点了,兄弟们帮忙卡卡常(写了一天了cao
查看原帖
最后一个点了,兄弟们帮忙卡卡常(写了一天了cao
243750
星空舞涵楼主2020/10/28 20:14
#include <bits/stdc++.h>
using namespace std;

int n,m;
long long a[100010];
int ss[100001];
long long  last;

int *fa[500001];
int *fa2[500001];
int cnt[45555555];
int *poi=cnt;
long long  o[500001];
int maxx;


inline void add(int x,long long k)
{
    while(x<=n)
    {
        a[x]+=k;
        x+=(x&(-x));
    }
}

long long sum(int x)
{
    long long he=0;
    while(x>0)
    {
        he+=a[x];
        x=x-(x&-x);
    }
    return he;
}


int read( )
{
    int f=0;
    char ch;
    ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')
    {
        f=f*10+ch-'0';
        ch=getchar();
    }
    return f;
}

int find(int x,int k)
{
    if(k==o[x]||k==fa2[x][k])return k;
    return fa2[x][k]=find(x,fa2[x][k]);
}

inline void write(long long  X)
{
    if(X<0) {X=~(X-1); putchar('-');}
    if(X>9) write(X/10);
    putchar(X%10+'0');
}
signed main( )
{
    n=read( );
    m=read( );
    for(int i=1;i<=n;++i)
    {
        ss[i]=read();
        maxx=max(ss[i],maxx);
        add(i,ss[i]);
        o[ss[i]]++;
    }
    for(int i=1;i<=maxx;i++)
    for(int j=i+i;j<=maxx;j=j+i)
    o[i]=o[i]+o[j];
    
    for(int i=1;i<=maxx;i++)
    {
        fa2[i]=poi;
        poi=poi+o[i];
        fa[i]=poi;
        poi=poi+o[i];
        for(int j=0;j<o[i];j++)fa2[i][j]=j;
        o[i]=0;
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j*j<=ss[i];j++)
    {
        if(ss[i]%j==0)
        {
            fa[j][o[j]++]=i;
            if(ss[i]!=j*j)
            {
                fa[ss[i]/j][o[ss[i]/j]++]=i;
            }
        }
    }
    
    int kind,l,r,x;
    for(int i=1;i<=m;++i)
    {
        kind=read( );
        if(kind==1)
        {
            l=read( ),r=read( ),x=read( ),l^=last,r^=last,x^=last;
            if(x==1)continue;
            if(o[x]==0)continue;
            int wei=lower_bound(fa[x],fa[x]+o[x],l)-fa[x];
            for(int j=find(x,wei);j<o[x]&&fa[x][j]<=r;j=find(x,j+1))
            {
                if(ss[fa[x][j]]%x==0)
                {
                    int o=fa[x][j];
                    ss[o]=ss[o]/x;
                    add(o,(long long)(-ss[o]*(x-1)));
                    
                }
                if(ss[fa[x][j]]%x!=0)fa2[x][j]=j+1;
            }
        }
        else{
            l=read( ),r=read( ),l^=last,r^=last;
            last=sum(r)-sum(l-1);
            write(last);
            putchar('\n');
        }
    }
    return 0;
}

差了48ms

2020/10/28 20:14
加载中...