MnZn刚学莫队,求卡常,玄关
查看原帖
MnZn刚学莫队,求卡常,玄关
552694
ink_ngm楼主2024/11/8 17:40
#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;
inline int read(){
    register int x=0;register char ch=getchar_unlocked();
    while(ch<'0'||'9'<ch){ch=getchar_unlocked();}
    while('0'<=ch&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48),ch=getchar_unlocked();}
    return x;
}
struct FastMod {
    unsigned long long b, m;
    FastMod(unsigned long long b) : b(b), m(((__int128(1) << 64) / b)) {}
    unsigned long long reduce(unsigned long long a) {
        unsigned long long q = (unsigned long long)((__int128(m) * a) >> 64);
        unsigned long long r = a - q * b;
        return r>=b?r-b:r;
    }
};
FastMod F(2);
inline void write(int x){
    if(!x){
        puts("0");
        return;
    }
    register int top=0,st[10];
    while(x){
        st[++top]=x%10;
        x/=10;
    }
    ++top;
    while(--top) putchar(st[top]+'0');
    putchar('\n');
    return;
}
const int N=1e5+1;
struct node{
    int l,r,p,id;
}que[N];
struct LINKED_LIST{
    struct Link{int pre,nxt;}lk[N];int cnt;
    LINKED_LIST(){cnt=0;}
    inline void insert(int x){
        lk[cnt].nxt=x;
        lk[x].pre=cnt;
        cnt=x;
    }
    inline void erase(int x){
        x^cnt?lk[lk[x].pre].nxt=lk[x].nxt,lk[lk[x].nxt].pre=lk[x].pre:cnt=lk[x].pre;
        lk[x].pre=lk[x].nxt=0;
    }
}vis;
int a[N],id[N],len,pd[N],ans[N],pow1[N],pow2[N];
inline bool cmp(node x,node y){
    return id[x.l]^id[y.l]?x.l<y.l:id[x.l]&1?x.r<y.r:x.r>y.r;
}
inline void prepare(int p){
    F = FastMod(p);
    register int i;
    for(i=1;i<=len;++i) pow1[i]=F.reduce(pow1[i-1]<<1ll);
    for(i=1;i<=len+1;++i) pow2[i]=F.reduce(1ll*pow2[i-1]*pow1[len]);
    return;
}
inline int work(int x,int p){
    return F.reduce(1ll*pow1[x%len]*pow2[x/len]);
}
inline void add(int x){
    !pd[a[x]]?vis.insert(a[x]),1:0;
    ++pd[a[x]];
    return;
}
inline void delet(int x){
    --pd[a[x]];
    !pd[a[x]]?vis.erase(a[x]),1:0;
    return;
}
inline int max(int x,int y){
    return x>y?x:y;
}
int main(){
    register int n=read(),m=read(),i,j,l,r,all;
    len=sqrt(n),pow1[0]=pow2[0]=1;
    for(i=1;i<=n;++i) a[i]=read();
    for(i=1;i<=m;++i){
        que[i].l=read(),que[i].r=read(),que[i].p=read(),que[i].id=i;
        id[que[i].l]=(que[i].l-1)/len+1;
    }
    sort(que+1,que+1+m,cmp);
    i=l=que[1].l,r=que[1].r;
    prepare(que[1].p);
    --i;
    while(++i<=r) add(i);
    all=r-l+1;
    for(j=vis.lk[0].nxt;j;j=vis.lk[j].nxt){
        ans[que[1].id]=F.reduce(ans[que[1].id]+F.reduce(F.reduce(1ll*j*work(all-pd[j],que[1].p))*(work(pd[j],que[1].p)-1)));
    }
    for(i=2;i<=m;++i){
        prepare(que[i].p);
        while(l>que[i].l) --l,add(l);
        while(r<que[i].r) ++r,add(r);
        while(r>que[i].r) delet(r),--r;
        while(l<que[i].l) delet(l),++l;
        all=r-l+1;
        for(j=vis.lk[0].nxt;j;j=vis.lk[j].nxt)
            ans[que[i].id]=F.reduce(ans[que[i].id]+F.reduce(F.reduce(1ll*j*work(all-pd[j],que[i].p))*(work(pd[j],que[i].p)-1)));
    }
    i=0;
    while(++i<=m) write(ans[i]);
    return 0;
}
2024/11/8 17:40
加载中...