WA萌新求助
查看原帖
WA萌新求助
295504
Into_qwq楼主2020/5/15 16:40
#pragma GCC optimize("Ofast","-funroll-loops","-fdelete-null-pointer-checks")
#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#include<bits/stdc++.h>
struct istream{
    char buf[23333333],*s;
    inline e istream&operator>>(int&d){
        d=0;
        for(;!isdigit(*s);++s);
        while(isdigit(*s)) d=(d<<3)+(d<<1)+(*s++^'0');
        return*this;
    }
}cin;
typedef long long ll;
const int size=317;
const int N=100010;
struct node{
    int l,r,mod,id;
}q[N];
int n,m;
std::unordered_set<int> qwq;
int fk[N],a[N],cnt[N],awa[N],p1[N]={1},p2[N]={1};
ll ans[N];
inline bool cmp(node a,node b)
{
    return (fk[a.l]^fk[b.l])?fk[a.l]<fk[b.l]:fk[a.l]&1?a.r<b.r:a.r>b.r;
}
inline void add(int i)//位置
{
    register int x=cnt[i];
    if(x){/*如果cnt包含x[i]*/awa[x]-=i;/*减掉*/if(awa[x]==0) qwq.erase(x);/*如果元素不存在了(被删掉了为0),则把它从表里删去*/}
    ++cnt[i],x=cnt[i];
    if(!awa[x])/*如果不包含x*/ qwq.insert(x);
    awa[x]+=i;
}
inline void del(int i)//位置
{
    register int x=cnt[i];
    awa[x]-=i;
    if(!awa[x])/*如果不包含x*/ qwq.erase(x);
    --cnt[i],x=cnt[i];
    if(x){/*如果cnt包含x[i]*/if(awa[x]==0) qwq.insert(x);/*如果元素不存在了则把它加入表里*/awa[x]+=i;/*加上*/}
}
inline void work(int i){register int l=1,r=0;while(l<q[i].l) del(a[l++]);while(l>q[i].l) add(a[--l]);while(r<q[i].r) add(a[++r]);while(r>q[i].r) del(a[r--]);}
inline ll pow(int i,int qaq){
    return 1ll*p1[i%size]*p2[i/size]%qaq;
}
inline ll iee(int l,int r,int qaq)
{
    ll ans=0;
    ll S=pow(r-l+1,qaq);
    std::unordered_set <int>::iterator it;
    for(it=qwq.begin();it!=qwq.end();++it) ans=(ans+awa[*it]*(S-pow(r-l+1-*it,qaq)+qaq)%qaq)%qaq;
    ans%=qaq;
    return ans;
}
int main(){
    cin>>n,cin>>m;
    for(register int i=1;i<=n;i++) fk[i]=(i-1)/size+1;
    for(register int i=1;i<=n;++i) cin>>a[i];
    for(register int i=1;i<=m;++i){cin>>q[i].l,cin>>q[i].r,cin>>q[i].mod;q[i].id=i;}
    std::sort(q+1,q+1+m,cmp);
    for(register int i=1;i<=m;++i){
        work(i);
        for(register int j=1;j<=size;++j) p1[j]=1ll*(p1[j-1]<<1)%q[i].mod;
        p2[1]=p1[size];
        for(register int j=2;j<=size;++j) p2[j]=1ll*p2[j-1]*p2[1]%q[i].mod;
        ans[q[i].id]=iee(q[i].l,q[i].r,q[i].mod);
    }
    for(register int i=1;i<=m;++i) std::cout<<ans[i]<<std::endl;
    return 0;
}
2020/5/15 16:40
加载中...