1 /* 2 * 排序+二分 3 */ 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 #define N 501 8 9 int a[N], b[N*N], c[N]; 10 11 int cmp(const void *a, const void *b) { 12 return *(int *)a - *(int *)b; 13 } 14 15 int main() { 16 int l, n, m, s, i, j, k, tmp, tmpp, left, right, mid, flag, cas = 0; 17 while (scanf("%d%d%d", &l, &n, &m) != EOF) { 18 for (i=0; i<l; ++i) scanf ("%d", &a[i]); 19 for (k=-1,i=0; i<n; ++i) { 20 scanf ("%d", &tmp); 21 for (j=0; j<l; ++j) b[++k] = tmp + a[j]; 22 } 23 for (i=0; i<m; ++i) scanf ("%d", &c[i]); 24 qsort(b, k+1, sizeof(int), cmp); 25 scanf ("%d", &s); 26 printf ("Case %d:\n", ++cas); 27 while (s--) { 28 scanf ("%d", &tmpp); 29 // if (tmpp-c[0]<b[0] || tmpp-c[m-1]>b[k]) {puts("NO"); continue;} 30 flag = 0; 31 for (i=0; i<m; ++i) { 32 tmp = tmpp - c[i]; 33 left = 0; 34 right = k; 35 while (left <= right) { 36 mid = (left + right) >> 1; 37 if (tmp == b[mid]) { flag = 1; break;} 38 else if (tmp < b[mid]) right = mid - 1; 39 else left = mid + 1; 40 } 41 if (flag) break; 42 } 43 if (flag) puts("YES"); 44 else puts("NO"); 45 } 46 } 47 return 0; 48 }