#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
struct vec{
vector<int> v;
int c,f,l;
}a[30050];
map<int,bool> mp[30050];
int n,m,q,s[30050];
int main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i].c;
for(int j=1;j<=a[i].c;j++)
{
int x;
cin>>x;
a[i].v.push_back(x);
mp[i][x]=1;
}
sort(a[i].v.begin(),a[i].v.end());
a[i].f=a[i].c-1;
a[i].l=0;
}
for(int i=1;i<=q;i++)
{
int op,x,y;
cin>>op>>x>>y;
if(op==1||op==2)
{
if(op==1) s[x]+=y;
else s[x]-=y;
if(s>0) while(a[x].v[a[x].f]+s[x]>m)
{
if(a[x].f<a[i].l) break;
mp[x][a[x].v[a[x].f]]=0;
a[x].f--;
}
if(s<0) while(a[x].v[a[x].l]+s[x]<1)
{
if(a[i].f<a[i].l) break;
mp[x][a[x].v[a[x].l]]=0;
a[x].l++;
}
}
if(op==3)
{
int ans=0;
for(int j=0;j<a[x].c;j++) if(mp[y][a[x].v[j]]+s[x]-s[y]) ans++;
cout<<ans<<endl;
}
if(op==4)
{
int ans=a[y].c;
for(int j=0;j<a[x].c;j++) if(!(mp[y][a[x].v[j]]+s[x]-s[y])) ans++;
cout<<ans<<endl;
}
if(op==3)
{
int ans=0;
for(int j=0;j<a[x].c;j++) if((!mp[y][a[x].v[j]]+s[x]-s[y])) ans++;
for(int j=0;j<a[y].c;j++) if((!mp[x][a[y].v[j]]+s[x]-s[y])) ans++;
cout<<ans<<endl;
}
}
return 0;
}