贪心一下。
接水的时候肯定是从小到大接。
好像没什么性质。莫队好了。
观察到奇怪的强制在线方法。。。
类似[糖果公园/苹果树]做法。
块大小没仔细算,直接$n^{0.5}$的,卡了70s评测姬 233。
复杂度不明。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
#define int LL
int n,m,key;
int dfn[200005];
int belong[200005];
struct N{
int x,y,id;
N(int a=0,int b=0,int d=0){
x=a,y=b,id=d;
if(dfn[x]>dfn[y]) swap(x,y);
}
friend bool operator < (const N&a,const N&b){
if(belong[a.x]!=belong[b.x]) return belong[a.x]<belong[b.x];
return dfn[a.y]<dfn[b.y];
}
}q[400005];
int to[200005],cc;
int t[200005];
int H[200005],X[200005],P[200005],tot;
inline void add(int x,int y){
P[++tot]=y;X[tot]=H[x];H[x]=tot;
}
char s[10];
LL ans[400005];
int num,tim;
int stk[200005],top;
int SIZE;
int cnt;
int fa[200005][21];
int dep[200005];
void dfs(int x){
int bot=top;dfn[x]=++tim;
dep[x]=dep[fa[x][0]]+1;
for(int i=H[x];i;i=X[i]){
fa[P[i]][0]=x;
dfs(P[i]);
if(top-bot>=SIZE){
cnt++;
while(top>bot){
belong[stk[--top]]=cnt;
}
}
}
stk[top++]=x;
}
bool v[200005];
LL Ans;
#define lowbit(x) ((x)&-(x))
struct BIT{
long long c[200005];
void add(int x,int d){
while(x<=200000){
c[x]+=d;
x+=lowbit(x);
}
}
LL ask(int x){
LL ret=0;
while(x>0){
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
}A,B;
//A sum
//B num
// <= x <
void do_(int x,int type){
if(type){
//add
int p=t[x];
Ans+=A.ask(p);// <=
Ans+=(B.ask(200000)-B.ask(p))*1LL*to[t[x]];
Ans+=to[t[x]];
A.add(p,to[t[x]]);
B.add(p,1);
}else{
//remove
int p=t[x];
A.add(p,-to[t[x]]);
B.add(p,-1);
Ans-=A.ask(p);// <=
Ans-=(B.ask(200000)-B.ask(p))*1LL*to[t[x]];
Ans-=to[t[x]];
}
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--) if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
if(x==y) return x;
for(int i=20;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
#undef int
int main(){
#define int LL
scanf("%lld%lld%lld",&n,&m,&key);
SIZE=sqrt((double)n)+1;
for(int i=1;i<=n;i++) scanf("%lld",&t[i]),to[i]=t[i];
sort(to+1,to+n+1);
cc=unique(to+1,to+n+1)-(to+1);
for(int i=1;i<=n;i++) t[i]=lower_bound(to+1,to+cc+1,t[i])-to;
for(int i=1,x;i<=n;i++){
scanf("%lld",&x);
if(i==1) continue;
add(x,i);
}
dfs(1);
while(top>0) belong[stk[--top]]=cnt;
for(int i=0,x=1;i<m;i++){
scanf("%s",s);
if(s[0]=='C'){
scanf("%lld",&x);
}else{
int k;
scanf("%lld",&k);
int y=k%n+1;
int qqq=num/2;
q[num]=N(x,y,qqq<<1);
num++;
y=(k+key)%n+1;
q[num]=N(x,y,qqq<<1|1);
num++;
}
}
for(int j=0;j<=19;j++){
for(int i=1;i<=n;i++){
fa[i][j+1]=fa[fa[i][j]][j];
}
}
sort(q,q+num);
int x=1,y=1;
for(int i=0;i<num;i++){
int qx=lca(x,q[i].x);
int qy=lca(y,q[i].y);
while(x!=qx){
do_(x,v[x]^=1);
x=fa[x][0];
}
x=q[i].x;
while(x!=qx){
do_(x,v[x]^=1);
x=fa[x][0];
}
while(y!=qy){
do_(y,v[y]^=1);
y=fa[y][0];
}
y=q[i].y;
while(y!=qy){
do_(y,v[y]^=1);
y=fa[y][0];
}
x=lca(q[i].x,q[i].y);
do_(x,v[x]^=1);
ans[q[i].id]=Ans;
do_(x,v[x]^=1);
x=q[i].x,y=q[i].y;
}
LL pre=0;
for(int i=0;i<num/2;i++){
if(pre&1){
printf("%lld\n",pre=ans[i<<1|1]);
}else{
printf("%lld\n",pre=ans[i<<1]);
}
}
return 0;
}
/*
3 2 0
3 3 2
0 3 1
C 3
Q 1
7
*/