直接双指针模拟就好了,然后拿ans统计答案的min.注意变量之间别混淆.

//orz代码构思太弱了...
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
typedef long long ll;
struct vv{
    ll col,pos;
}a[N];
int cnt[N];//统计

bool cmp(vv x,vv y)
{
    if(x.pos==y.pos) return x.col<y.col;
    else             return x.pos<y.pos;
}

int main()
{
    int n,k,vnt=0;
    scanf("%d%d",&n,&k);
    n=0;
    for(int i=1;i<=k;i++)
    {
        int x;scanf("%d",&x);
        for(int j=1;j<=x;j++)
        {
            ++n;
            scanf("%lld",&a[n].pos);
            a[n].col=i;
        }
    }
    sort(a+1,a+1+n,cmp);
   // for(int i=1;i<=n;i++) cout<<a[i].col<<' ';
    //cout<<endl;
    ll l=1;ll ans=1e15;
    for(ll r=1;r<=n;r++)//枚举右端点.
    {
        //int x=a[r].pos;
        //cout<<a[r].col<<endl;
        cnt[a[r].col]++;
        if(cnt[a[r].col]==1) vnt++;
        //cout<<vnt<<endl;
        if(vnt==k)
        {
            while(cnt[a[l].col]>1) {cnt[a[l].col]--; l++; }
            ans=min(ans,a[r].pos-a[l].pos);
        }
    }
    printf("%lld\n",ans);
    return 0;
}