解题思路
线段树+前缀和,线段树套模板就可以了
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";
}
}
}