#include<bits/stdc++.h>
#define ll long long
#define reg register
#define db double
#define il inline
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
const int N=150005,blo=200000;
int n,m,q;
int cnt[N],c[N],a[N],mark[N];
vector<int>v,pos[N];ll sumpre[N],sumsuf[N];
int fpre[N],fsuf[N];
ll summ[blo+5],id[N],R[blo+5];
int chan[N];
ll ans[N];
ll query(int l,int r){
ll re=0;
if(id[l]==id[r]){
for(int i=l;i<=r;i++)re+=a[i];
}else{
for(int i=l;i<=R[id[l]];i++){
if(mark[c[i]]==0)
re+=a[i];
}
for(int i=id[l]+1;i<id[r];i++)re+=summ[i];
for(int i=R[id[r]-1]+1;i<=r;i++)if(mark[c[i]]==0)re+=a[i];
}
return re;
}
int l[N],r[N],op[N];
signed main(){
read(n);read(m);read(q);
for(int i=1;i<=n;i++){
read(c[i]);cnt[c[i]]++;pos[c[i]].push_back(i);chan[i]=pos[c[i]].size()-1;
}
for(int i=1;i<=n;i++)read(a[i]);
for(int i=1;i<=m;i++){
if(cnt[i]>=blo){
mark[i]=v.size()+1;v.push_back(i);
}
}
for(int i=1;i<=q;i++){
read(op[i]);
if(op[i]==1){
read(l[i]),read(r[i]);
}else read(l[i]);
}
memset(cnt,0,sizeof(cnt));
for(int i=0;i<v.size();i++){
int la=0;
for(int j=1;j<=n;j++){
sumpre[j]=0;
if(c[j]==v[i]){
la=j;sumpre[j]=a[j];
}fpre[j]=la;sumpre[j]+=sumpre[j-1];
}
for(int j=1;j<=n;j++){
if(fpre[j]==0)fpre[j]=la;
else break;
}
la=0;
for(int j=n;j>=1;j--){
sumsuf[j]=0;
if(c[j]==v[i]){
la=j;sumsuf[j]=a[j];
}
sumsuf[j]+=sumsuf[j+1];
fsuf[j]=la;
}
for(int j=n;j>=1;j--){
if(fsuf[j]==0)fsuf[j]=la;
else break;
}
for(int j=1;j<=q;j++){
if(op[j]==2){
if(l[j]==v[i])cnt[l[j]]++;
}else{
int ql=l[j],qr=r[j];
if(fpre[qr]<ql||fpre[qr]>qr)continue;
int fl=fsuf[ql],fr=fpre[qr];
fl=chan[fl];fr=chan[fr];
fl-=cnt[v[i]];fr-=cnt[v[i]];
if(fl<0){
fl=-fl;fl%=pos[v[i]].size();fl=-fl;
}else fl%=pos[v[i]].size();
if(fr<0){
fr=-fr;fr%=pos[v[i]].size();fr=-fr;
}else fr%=pos[v[i]].size();
fl=(fl+pos[v[i]].size())%pos[v[i]].size();
fr=(fr+pos[v[i]].size())%pos[v[i]].size();
if(fl>fr){
ans[j]+=sumsuf[pos[v[i]][fl]]+sumpre[pos[v[i]][fr]];
}else{
ans[j]+=sumpre[pos[v[i]][fr]];if(fl)ans[j]-=sumpre[pos[v[i]][fl-1]];
}
}
}
}
for(int i=1;i<=n;i++){
id[i]=(i-1)/blo+1;R[id[i]]=i;
if(mark[c[i]]==0){
summ[id[i]]+=a[i];
}
}
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=q;i++){
if(op[i]==2){
if(mark[l[i]]==0){
int len=pos[l[i]].size(),tmp=a[pos[l[i]][len-1]];
for(int j=len-1;j>=0;j--){
int u=pos[l[i]][j],v;if(j)v=pos[l[i]][j-1];
if(j!=0){
summ[id[u]]-=a[u];a[u]=a[v];summ[id[u]]+=a[u];
}else{
summ[id[u]]-=a[u];a[u]=tmp;summ[id[u]]+=a[u];
}
}
}
}else{
ans[i]+=query(l[i],r[i]);
}
}
for(int i=1;i<=q;i++){
if(op[i]==1)cout<<ans[i]<<endl;
}
return 0;
}