题解
#include
using namespace std;
char nc() {
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
void Read(int& x) {
char c=nc();
for(;c<'0'||c>'9';c=nc());
for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());
}
void Read(char& c) {
char C=nc();
for(;C!='C'&&C!='Q';) C=nc();
c=C;
}
const int N=30010;
const int M=128;
const int P=10007;
int inv[P];
struct Int {
int a,b;
Int(int a=0,int b=0):a(a),b(b){}
void Set(int x) {
if(x) a=x,b=0;else a=0,b=1;
}
void operator /= (int x) {
if(x) a=a*inv[(x+P)%P]%P;else --b;
}
void operator *= (int x) {
if(x) a=a*x%P;else ++b;
}
int Get() {
return b?0:a;
}
} g[N][M];
int k,n,m,x,y,q;
int h[N],t[N<<1],nx[N<<1],num;
int sz[N],f[N],d[N],top[N],son[N],sum[N],w[N];
int Rt[N],ls[N<<2],rs[N<<2],tot;
int c[N<<2][M],cl[N<<2][M],cr[N<<2][M],ca[N<<2][M];
int tmp[M][M];
int a[N],st[N];
int Ans[M];
char C;
void FWT(int* a,int n,int d) {
for(int i=1;i1)
for(int j=0;j1)
for(int k=0;kint x=a[j+k],y=a[j+k+i];
if(d) a[j+k]=(x+y)%P,a[j+k+i]=(x-y)%P;else a[j+k]=(x+y)*inv[2]%P,a[j+k+i]=(x-y)*inv[2]%P;
}
}
void Add(int x,int y) {
t[++num]=y;nx[num]=h[x];h[x]=num;
}
void Dfs(int x,int y) {
f[x]=y;d[x]=d[y]+1;sz[x]=1;
for(int i=h[x];i;i=nx[i])
if(t[i]!=y) {
Dfs(t[i],x);
sz[x]+=sz[t[i]];
if(sz[t[i]]>sz[son[x]]) son[x]=t[i];
}
}
void Up(int x) {
for(int i=0;ix][i]=(c[ls[x]][i]+c[rs[x]][i]+cr[ls[x]][i]*cl[rs[x]][i])%P;
cl[x][i]=(cl[ls[x]][i]+ca[ls[x]][i]*cl[rs[x]][i])%P;
cr[x][i]=(cr[rs[x]][i]+ca[rs[x]][i]*cr[ls[x]][i])%P;
ca[x][i]=ca[ls[x]][i]*ca[rs[x]][i]%P;
}
}
void Build(int& x,int l,int r) {
x=++tot;
if(l==r) {
w[st[l]]=l;
for(int i=0;ix][i]=cl[x][i]=cr[x][i]=ca[x][i]=g[st[l]][i].Get();
return;
}
int Mid=l+r>>1;
Build(ls[x],l,Mid);Build(rs[x],Mid+1,r);
Up(x);
}
void Update(int x,int l,int r,int y,int z) {
if(l==r) {
for(int i=0;ix][i]=cl[x][i]=cr[x][i]=ca[x][i]=g[z][i].Get();
return;
}
int Mid=l+r>>1;
if(y<=Mid) Update(ls[x],l,Mid,y,z);else Update(rs[x],Mid+1,r,y,z);
Up(x);
}
void Dfs1(int x,int y) {
top[x]=y;
for(int i=0;ix][i].Set(tmp[a[x]][i]);
if(son[x]) Dfs1(son[x],y);
for(int i=h[x];i;i=nx[i])
if(t[i]!=f[x]&&t[i]!=son[x]) {
Dfs1(t[i],t[i]);
for(int j=0;jx][j]*=(cl[Rt[t[i]]][j]+tmp[0][j])%P;
}
if(x==y) {
int cnt=0;
for(int i=x;i;i=son[i]) st[++cnt]=i;
Build(Rt[x],1,cnt);sum[x]=cnt;
for(int i=0;ix]][i])%P;
}
}
void Modify(int x,int y) {
if(a[x]==y) return;
for(int i=0;ix][i]/=tmp[a[x]][i],g[x][i]*=tmp[y][i];
a[x]=y;
while(top[x]!=1) {
int t=top[x];
for(int i=0;i0][i])%P,Ans[i]=(Ans[i]-c[Rt[t]][i])%P;
Update(Rt[t],1,sum[t],w[x],x);
for(int i=0;i*=(cl[Rt[t]][i]+tmp[0][i])%P,Ans[i]=(Ans[i]+c[Rt[t]][i])%P;
x=f[t];
}
for(int i=0;i1]][i])%P;
Update(Rt[1],1,sum[1],w[x],x);
for(int i=0;i1]][i])%P;
}
int main() {
Read(n);Read(m);
inv[0]=inv[1]=1;
for(int i=2;i%i]*(P-P/i)%P;
for(int i=1;i<=n;i++) Read(a[i]);
for(int i=1;ix),Read(y),Add(x,y),Add(y,x);
for(int i=0;i1,FWT(tmp[i],M,1);
Dfs(1,0);Dfs1(1,1);
Read(q);
while(q--) {
Read(C);
if(C=='C') Read(x),Read(y),Modify(x,y);else {
Read(x);
FWT(Ans,M,0);
printf("%d\n",(Ans[x]+P)%P);
FWT(Ans,M,1);
}
}
return 0;
}