传送门
题解:
小清新送分题。
设序列长度为 2 k 2^k 2k,按照那个预处理完了之后,所有序列一定是有一半完全一样,另一半递归满足这个性质。
所以描述一个序列只需要 log m \log m logm 的复杂度。
发现在xor卷积下,两个满足该性质的序列卷积结果依然满足,所以用这个方式维护下去即可。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const
namespace IO{
inline char gc(){
static cs int Rlen=1<<22|1;static char buf[Rlen],*p1,*p2;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;
}template<typename T>T get_integer(){
char c;bool f=false;while(!isdigit(c=gc()))f=c=='-';T x=c^48;
while(isdigit(c=gc()))x=((x+(x<<2))<<1)+(c^48);return f?-x:x;
}inline int gi(){return get_integer<int>();}
}using namespace IO;
using std::cerr;
using std::cout;
#define ctz(x) __builtin_ctz(x)
#define clz(x) __builtin_clz(x)
cs int mod=998244353;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(int a,int b){return a-b<0?a-b+mod:a-b;}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
inline void Mul(int &a,int b){a=mul(a,b);}
cs int bit=19,N=7e5+7;
int n,m,Q,up;
struct atom{
int vl[bit+1],otr,msk;
int query(int p)cs{
p^=msk;if(p==0)return otr;
return vl[31-clz(p)];
}
};
atom a[N];
void merge(atom &a,cs atom &b){
int sa=a.otr,sb=b.otr;
for(int re i=0;i<up;++i){
Inc(sa,mul(1<<i,a.vl[i]));
Inc(sb,mul(1<<i,b.vl[i]));
}int sm=0;a.msk^=b.msk;
for(int re i=up-1;~i;--i){
Dec(sa,mul(1<<i,a.vl[i]));
Dec(sb,mul(1<<i,b.vl[i]));
int tmp=mul(a.vl[i],b.vl[i]);
a.vl[i]=add(sm,add(mul(a.vl[i],sb),mul(b.vl[i],sa)));
Inc(sm,mul(tmp,1<<i));
}a.otr=add(sm,mul(a.otr,b.otr));
}
void Main(){
n=gi(),m=gi(),Q=gi();
while((1<<up)<=m)++up;
for(int re i=1;i<=n;++i){
int x=gi(),v=gi();a[i].msk=x;
while(x){
a[i].vl[ctz(x)]=mul(x,x^v),
x&=x-1;
}
}for(int re i=2;i<=n;++i)
merge(a[i],a[i-1]);
while(Q--){
int x=gi(),p=gi();
cout<<a[x].query(p)<<"\n";
}
}
inline void file(){
#ifdef zxyoi
freopen("sequence.in","r",stdin);
#endif
}signed main(){file();Main();return 0;}