题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4791
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<list>
#define mem(x,y)memset(x,y,sizeof(x))
#define max(a,b)(a)>(b)?(a):(b)
#define min(a,b)(a)<(b)?(a):(b)
#define INF 0x1f1f1f1f
#define M 10000007
#define eps 1e-10
using namespace std;
typedef long long int LL;
typedef __int64 ll;
const int maxn=2005;
LL a[100005];
LL b[100005];
LL c[100005];
LL f[100005];
int main()
{
LL flag;
int T,n,m;
scanf("%d",&T);
while(T--)
{
memset(f,0,sizeof(f));
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%I64d %I64d",&a[i],&b[i]);
for(int i=1; i<=m; i++)
scanf("%I64d",&c[i]);
f[n]=a[n]*b[n];
flag=f[n];
for(int i=n-1; i>=1; i--)
{
if(a[i]*b[i]<flag)
{
f[i]=a[i]*b[i];
flag=a[i]*b[i];
}
else
f[i]=flag;
}
for(int i=1; i<=m; i++)
{
if(c[i]==0)
{
printf("0\n");
continue;
}
if(c[i]<a[1])
{
printf("%I64d\n",f[1]);
continue;
}
if(c[i]>=a[n])
{
printf("%I64d\n",c[i]*b[n]);
continue;
}
int id=upper_bound(a+1,a+n+1,c[i])-a-1;
LL k=min(f[id+1],c[i]*b[id]);
printf("%I64d\n",k);
}
}
return 0;
}