QAQ在第五个点就T了,不知道到底是莫队复杂度有问题还是只是人菜常数大QAQ,求大佬帮帮
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <sstream>
#define mp(a,b) make_pair(a,b)
#define p1(x) x.first
#define p2(x) x.second
#define double long double
#define int long long
using namespace std;
const int M=998244353;
int n,m,q;
const int siz=333;
int a[100300];
int bel[100300];
int ans[100300];
int C[100300];
map<int,int>K;
int cnt =0;
struct node{
int l,r,id;
};
inline bool cmp(node x,node y){
return bel[x.l]==bel[y.l]?bel[x.l]%2==0?x.r>y.r:x.r<y.r:bel[x.l]<bel[y.l];
}
inline int qp(int a,int x){
int res=1;
while(x){
if(x&1)res=res*a%M;
a=a*a%M;
x>>=1;
}
return res;
}
inline int inv(int x){return qp(x,M-2);}
struct ASK{
int k;
vector<node>g;
int G;
int c[100300];
int s[100300];
inline void calc(){
G=(k*m+n)%M;
sort(g.begin(),g.end(),cmp);
int l=1,r=0;
int res=1;
s[0]=1;
for(int i=1;i<=n;i++)
s[i]=s[i-1]*(G-(n-i))%M;
for(int i=1;i<=m;i++)
C[i]+=k;
for(node A:g){
while(r<A.r){
r++;
res=res*(C[a[r]]-c[a[r]])%M;
c[a[r]]++;
}
while(l>A.l){
l--;
res=res*(C[a[l]]-c[a[l]])%M;
c[a[l]]++;
}
while(r>A.r){
c[a[r]]--;
res=res*inv(C[a[r]]-c[a[r]])%M;
r--;
}
while(l<A.l){
c[a[l]]--;
res=res*inv(C[a[l]]-c[a[l]])%M;
l++;
}
ans[A.id]=res*s[n-(r-l+1)]%M;
}
for(int i=1;i<=m;i++)
C[i]-=k;
}
}T[110];
signed main(){
ios::sync_with_stdio(false);
//freopen("/Users/noip2019/Downloads/P7735_2.in","r",stdin);
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
bel[i]=(i+siz-1)/siz;
for(int i=1;i<=n;i++){
cin>>a[i];
C[a[i]]++;
}
for(int i=1;i<=q;i++){
int l,r,k;
cin>>l>>r>>k;
if(!K.count(k)){
K[k]=++cnt;
T[cnt].k=k;
}
T[K[k]].g.push_back({l,r,i});
}
for(int i=1;i<=cnt;i++)
T[i].calc();
for(int i=1;i<=q;i++)
cout<<ans[i]<<endl;
return 0;
}