这里很low地写了个线段树。。。
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e5+10; struct SegT{ int left; int right; int w; }; SegT q[N*4]; void Build(int num,int L,int R) { q[num].left=L; q[num].right=R; if(q[num].left==q[num].right) { scanf("%d",&q[num].w); return; } int mid=(L+R)/2; Build(2*num,L,mid); Build(2*num+1,mid+1,R); q[num].w=min(q[2*num].w,q[2*num+1].w); } int query(int num,int s,int t) { if(q[num].left>=s&&q[num].right<=t) return q[num].w; int mid=(q[num].left+q[num].right)/2; if(mid>=t) return query(2*num,s,t); else if(mid<s) return query(2*num+1,s,t); else return min(query(2*num,s,mid),query(2*num+1,mid+1,t)); } int main() { int T,cas=1,n,m; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); Build(1,1,n); int u,v; printf("Case %d: ",cas++); while(m--) { scanf("%d%d",&u,&v); printf("%d ",query(1,u,v)); } } return 0; }