• MI[i]预处理块i的最小值,最小值用multiset维护,复杂度q*n^(1/2)
#include<bits/stdc++.h>
using namespace std;

using ll=long long;
const int N=1e5+9;
const int inf=21e8;
int n,q,group[N],L[N],R[N],cnt,MI[N],id;
multiset<int>s[N];

void init()
{
	cnt=sqrt(n)+1;
	for(int i=1;i<=n;i++)MI[i]=inf;
	for(int i=1;i<=n;i++)
	{
		L[++id]=i;
		R[id]=min(n,i+cnt);
		for(int j=L[id];j<=R[id];j++)
		{
			group[j]=id;
			MI[id]=min(MI[id],*s[j].begin());
		}
		i=R[id];
	}
}

void change(auto &a,int x,int y,int t)
{
	int res=a[x][y];
	auto it=s[x].begin();
	int fr=*it,sc=*(++it);
	
	s[x].erase(s[x].find(a[x][y]));
	a[x][y]=t;
	s[x].insert(t);
	
	int p=0;
	for(int i=L[group[x]];i<=R[group[x]];i++)
	{
		if(p>=2)break;
		it=s[i].begin();
		if(*it==MI[group[x]])p++;
		if(*++it==MI[group[x]])p++;
	}
	
	if(p>=2)
	for(int i=L[group[x]];i<=R[group[x]];i++)
	MI[group[x]]=min(MI[group[x]],*s[i].begin());
	else
	{
		MI[group[x]]=inf;
		for(int i=L[group[x]];i<=R[group[x]];i++)
		MI[group[x]]=min(MI[group[x]],*s[i].begin());
	}
}

int MIN(auto &a,int en)
{
	int res=inf,l=L[group[en]],r=en,lagroup=group[en]-1;
	for(int i=1;i<=lagroup;i++)res=min(res,MI[i]);
	for(int i=l;i<=r;i++)res=min(res,*s[i].begin());
	return res;
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n;
    vector<vector<int>>a(n+1,vector<int>(1));
    for(int i=1;i<=n;i++)
    {
    	int m;cin>>m;
    	a[i].resize(m+1);
    	for(int j=1;j<=m;j++)cin>>a[i][j],s[i].insert(a[i][j]);
	}
	
	cin>>q;
	init();
	//cout<<cnt<<' '<<id<<'\n';
	//for(int i=1;i<=n;i++)cout<<group[i]<<' ';cout<<'\n';
	
	
	while(q--)
	{
		int t;cin>>t;
		if(t==1)
		{
			int i,j,x;cin>>i>>j>>x;
			change(a,i,j,x);
			//cout<<'\n';
			//for(int i=1;i<=id;i++)cout<<MI[i]<<' ';
			//cout<<'\n';
		}else
		{
			int r;cin>>r;
			cout<<MIN(a,r)<<'\n';
		}
	}
	
    return 0;
}
/*
4
3 2 2 3
3 4 5 6
4 7 8 9 10
2 1 2
5
2 2
1 1 1 10
2 3
1 1 2 11
2 2
*/