题解:
线段树,大力分类讨论访问到节点是因为定位到节点自身还是因为定位子树内节点。
发现是个与 q l , q r ql,qr ql,qr有关的二元二次函数,维护子树内部的和,没了。
分类讨论的相关细节这里不再讲解。
代码:
#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(){
char c;T num;
while(!isdigit(c=gc()));num=c^48;
while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);
return num;
}inline int gi(){return get<int>();}
}
using namespace IO;
using std::cerr;
using std::cout;
//x , y : ql , qr
struct Poly_xy{
double coef[2][2];Poly_xy(){}
double *operator[](int o){return coef[o];}
cs double *operator[](int o)cs{return coef[o];}
void operator+=(cs Poly_xy &B){
coef[0][0]+=B[0][0];
coef[0][1]+=B[0][1];
coef[1][0]+=B[1][0];
coef[1][1]+=B[1][1];
}
double calc(ll x,ll y)cs{
double res=0;
res+=coef[0][0];
res+=coef[1][0]*x;
res+=coef[0][1]*y;
res+=coef[1][1]*x*y;
return res;
}
};
cs int N=5e5+7;
Poly_xy t[N<<2|7];
void init_leaf(int u,int i){
t[u][1][1]=-1;
t[u][1][0]=i-1;
t[u][0][1]=i+1;
t[u][0][0]=-(i+1ll)*(i-1ll);
}
void init_node(int u,ll l,ll r){
t[u][1][1]=1;
t[u][1][0]=1-r;
t[u][0][1]=-1-l;
t[u][0][0]=(l+1)*(r-1);
t[u][0][0]+=(l+1)*(r-l)+(-r+1)*(r-l)+(r-l)*(r-l-1)/2;
t[u][1][0]+=-(r-l);
t[u][0][1]+=(r-l);
}
#define lc u<<1
#define rc u<<1|1
void build(int u,int l,int r){
if(l==r)return init_leaf(u,l);
int mid=l+r>>1;init_node(u,l,r);
build(lc,l,mid);build(rc,mid+1,r);
t[u]+=t[lc],t[u]+=t[rc];
}
double query(int u,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){
return t[u].calc(ql,qr);
}
int mid=l+r>>1;double ans=0;
if(ql<=mid)ans+=query(lc,l,mid,ql,qr);
if(mid<qr)ans+=query(rc,mid+1,r,ql,qr);
int inter=std::min(qr,r)-std::max(l,ql)+1;
int out=qr-ql+1-inter;
return ans+(ll)inter*out+(ll)inter*(inter+1)/2;
}
#undef lc
#undef rc
int n,Q,op;
void work(){
n=gi(),Q=gi(),op=gi();
build(1,1,n);ll ans=0;
while(Q--){
int l=gi(),r=gi();
l=(l^(ans*op))%n+1;
r=(r^(ans*op))%n+1;
if(l>r)std::swap(l,r);
ans=query(1,1,n,l,r);
cout<<ans<<"\n";
}
}
#undef zxyoi
void file(){
#ifdef zxyoi
freopen("ran.in","r",stdin);
#else
#ifndef ONLINE_JUDGE
freopen("ran.in","r",stdin);freopen("ran.out","w",stdout);
#endif
#endif
}
signed main(){file();work();return 0;}