解题思路

线段树+前缀和,线段树套模板就可以了
AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+5;
int t,x,y,q,a[N],m[N],s[N],tree[N],n;
inline int build(int i,int l,int r){
    if(l==r)return tree[i]=a[l];
    return tree[i]=min(build(i*2,l,(l+r)/2),build(i*2+1,(l+r)/2+1,r));
}
inline int query(int i,int l,int r){
    if(y<l||r<x)return 0x7f7f7f7f;
    if(x<=l&&r<=y)return tree[i];
    return min(query(i*2,l,(l+r)/2),query(i*2+1,(l+r)/2+1,r));
}
inline int modify(int i,int l,int r){
    if(l==r&&l==x)return tree[i]=y;
    if(x<l||r<x)return tree[i];
    return tree[i]=min(modify(i*2,l,(l+r)/2),modify(i*2+1,(l+r)/2+1,r));
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>t;
    for(int i=1;i<=t;i++){
        cin>>m[i];
        s[i]=s[i-1]+m[i];
        for(int j=1;j<=m[i];j++)
            cin>>a[++n];
    }
    memset(tree,0x7f,sizeof(tree));
    build(1,1,n);
    cin>>q;
    while(q--){
        int op;
        cin>>op;
        if(op==1){
            int i,j;
            cin>>i>>j>>y;
            x=s[i-1]+j;
            modify(1,1,n);
        }else{
            int i;
            cin>>i;
            x=1,y=s[i];
            cout<<query(1,1,n)<<"\n";
        }
    }
}