#include<cstdio>
#include<iostream>
using namespace std;
int d[100010];
int main()
{
int N;
scanf("%d",&N);
d[1]=0;
for(int i=2;i<=N+1;i++){
int dis;
scanf("%d",&dis);
d[i]=d[i-1]+dis; //N+1代表一圈总距离
}
int M;
scanf("%d",&M);
int s,e,left,right;
while(M--){
scanf("%d%d",&s,&e);
if(s>e){
int t=s;
s=e;
e=t;
}
left=d[e]-d[s];
right=d[N+1]-left;
int maxD=left>right?right:left;
printf("%d\n",maxD);
}
return 0;
}
这道题实质就是从左边走最短还是从右边走最短,因为求得是任意两点间距离,
那么如果我们让数组记为两间隔点的距离的话后面还要累加才行,不妨利用递推公式把距
离数组记为第一个点到每一个点的距离,这样还可以得到总距离,那么只需要求往一边走的距离就可以了。