#include<bits/stdc++.h>
using namespace std;
int b[100005],k[100005][30],lg[100005];
int n,m,g;
#define s lg[r-l+1]
int oper(int l,int r){return min(k[l][s],k[r-(1<<s)+1][s]);}
#undef s
struct SegTree{
#define lson ls[x]
#define rson rs[x]
#define mid ((l+r)>>1)
int tot;
int d[10000005],mark[10000005],ls[10000005],rs[10000005];
int get(int x,int l,int r){int L=(l-1)%n+1,R=(r-1)%n+1;return x?d[x]:r-l+1>=n?oper(1,n):R>=L?oper(L,R):min(oper(1,R),oper(L,n));}
void insert(int &x,int l,int r){if(!x)d[++tot]=get(x,l,r),x=tot;}
void pushup(int x,int l,int r){d[x]=min(get(lson,l,mid),get(rson,mid+1,r));}
void pushdown(int x,int l,int r){
if(!mark[x])return;
insert(rson,mid+1,r),insert(lson,l,mid);
d[x]=mark[lson]=mark[rson]=mark[x];
mark[x]=0;
}
void upd(int &x,int l,int r,int L,int R,int k){
insert(x,l,r);pushdown(x,l,r);
if(L<=l&&r<=R){mark[x]=k,pushdown(x,l,r);return;}
if(mid>=L)upd(lson,l,mid,L,R,k);
if(R>mid)upd(rson,mid+1,r,L,R,k);
pushup(x,l,r);
}
int query(int &x,int l,int r,int L,int R){
int ans=INT_MAX;
insert(x,l,r);
pushdown(x,l,r);
if(L<=l&&r<=R)return get(x,l,r);
if(mid>=L)ans=min(ans,query(lson,l,mid,L,R));
if(R>mid)ans=min(ans,query(rson,mid+1,r,L,R));
return ans;
}
#undef lson
#undef rson
#undef mid
}a;
int main(){
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
for(int i=1;i<=n;i++)scanf("%d",&b[i]),k[i][0]=b[i];
for(int j=1;j<=lg[n];j++){
for(int i=1;i<=n;i++){
k[i][j]=min(k[i][j-1],k[i+(1<<(j-1))][j-1]);
}
}
int t;
scanf("%d",&t);
while(t--){
int op,l,r,x;
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&l,&r,&x);
a.upd(g,1,n*m,l,r,x);
// cout<<a.query(g,1,n*m,1,1)<<' '<<a.get(0,3,3)<<' '<<oper(3,3)<<endl;
// a.pushup(1,1,3);
}else{
scanf("%d%d",&l,&r);
printf("%d\n",a.query(g,1,n*m,l,r));
}
}
return 0;
}
样例过了,WA on test 3