直接分类,查询答案直接输出
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdlib>
#include<iomanip>
#include<string>
#include<vector>
#include<map>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
#define Max(a,b) (a>b)?a:b
#define lowbit(x) x&(-x)
int l1,l2,r1,r2,sum;
double a[100005];
double ans(int x)
{
if(r1<=l2)
{
if(x<=r1-l1+1)
return a[l1+x-1];
else
return a[l2+x-1-r1+l1-1];
}
else if(r1<=r2)
{
if(x<=l2-l1)
return a[l1+x-1];
else if(x>r1-l1+1+r1-l2+1)
return a[l2+x-r1+l1-1-1];
else
return a[l2+(x-l2+l1+1)/2-1];
}
else
{
swap(r1,r2);
if(x<=l2-l1)
return a[l1+x-1];
else if(x>r1-l1+1+r1-l2+1)
return a[l2+x-r1+l1-1-1];
else
return a[l2+(x-l2+l1+1)/2-1];
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%lf",&a[i]);
for(int i=0; i<m; i++)
{
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(l1>l2)
{
swap(l1,l2);
swap(r1,r2);
}
sum=r1-l1+1+r2-l2+1;
if(sum%2)
printf("%.1f\n",ans(sum/2+1));
else
printf("%.1f\n",(ans(sum/2)+ans(sum/2+1))/2);
}
}
}