#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PP;
typedef long long LL;
const int maxn=500000;
PP maxsum[maxn*4];
int maxpre[maxn*4],maxsuf[maxn*4],a[maxn],x,y;
LL sum[maxn];
LL getsum(int x,int y){
return sum[y]-sum[x-1];
}
LL getsum(PP x){
return getsum(x.first,x.second);
}
PP better(PP x,PP y){
if(getsum(x)==getsum(y)) return x<y?x:y;
else return getsum(x)<getsum(y)?y:x;
}
void build(int o,int L,int R){
if(L==R){
maxpre[o]=maxsuf[o]=L;
maxsum[o]=make_pair(L,L);
return ;
}
int M=(L+R)/2;
build(o*2,L,M);
build(o*2+1,M+1,R);
LL t1=getsum(maxsuf[o*2],R);
LL t2=getsum(maxsuf[o*2+1],R);
if(t1==t2) maxsuf[o]=maxsuf[o*2];
else maxsuf[o]=t1>t2?maxsuf[o*2]:maxsuf[o*2+1];
t1=getsum(L,maxpre[o*2]);
t2=getsum(L,maxpre[o*2+1]);
if(t1==t2) maxpre[o]=maxpre[o*2];
else maxpre[o]=t1>t2?maxpre[o*2]:maxpre[o*2+1];
maxsum[o]=better(maxsum[o*2],maxsum[o*2+1]);
maxsum[o]=better(maxsum[o],make_pair(maxsuf[o*2],maxpre[o*2+1]));
}
PP query_pre(int o,int L,int R){
if(y>=maxpre[o]) return make_pair(L,maxpre[o]);
int M=(L+R)/2;
if(y<=M) return query_pre(o*2,L,M);
PP t1=query_pre(o*2+1,M+1,R);
t1.first=L;
return better(t1,make_pair(L,maxpre[o*2]));
}
PP query_suf(int o,int L,int R){
if(x<=maxsuf[o]) return make_pair(maxsuf[o],R);
int M=(L+R)/2;
if(x>M) return query_suf(o*2+1,M+1,R);
PP t1=query_suf(o*2,L,M);
t1.second=R;
return better(t1,make_pair(maxpre[o*2+1],R));
}
PP query(int o,int L,int R){
if(x<=L && y>=R) return maxsum[o];
int M=(L+R)/2;
if(x>M) return query(o*2+1,M+1,R);
if(y<=M) return query(o*2,L,M);
PP t1=query_suf(o*2,L,M);
PP t2=query_pre(o*2+1,M+1,R);
PP t3=better(query(o*2,L,M),query(o*2+1,M+1,R));
return better(make_pair(t1.first,t2.second),t3);
}
int main(){
int n,m,c=0;
while(scanf("%d%d",&n,&m)==2){
sum[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
PP ans=query(1,1,n);
printf("Case %d:\n",++c);
printf("%d %d\n",ans.first,ans.second);
}
}
return 0;
}