Problem:
Given $N (1 \le N \le 100000)$ values of distances $d_i$ between two points $p_i$ and $p_{i+1}$, answer $Q (1 \le Q \le 100000)$ queries of the form “What point $p$ is at or directly beneath some distance $d$?”
(Note: $p_0$ is at distance $0$)
Input (file.in):
Line $1$: Two integers, $N$ and $Q$.
Lines $2 \ldots N+1$: One integer, $d_i$.
Output (file.out):
Line $1 \ldots Q$: The answer to the question “What point $p$ is at or directly beneath some distance $d$?”.
Solution:
(Note: My solution may be off by one from the problem statement… off by one errors are very annoying…)
/* * Example Binary Search * Albert Gural */ #include <fstream> //File input/output using namespace std; FILE *fin = fopen("file.in", "r"); FILE *fout = fopen("file.out", "w"); // N is # of elements, Q is queries // value is a sorted array of values // on which to binary search. int N, Q, a, value[100005]; int main () { fscanf(fin, "%d %d", &N, &Q); // Initialize values from input value[0] = 0; for(int i = 1; i <= N; i++) { fscanf(fin, "%d", &a); value[i] = value[i - 1] + a; } // Binary Search on each query. for(int i = 0; i < Q; i++) { fscanf(fin, "%d", &a); int low = 0, high = N, mid = (low + high + 1) / 2; // While we haven't found the element, // choose low or high based on where query is // relative to mid. while(value[mid] != a && high - low > 1) { if(value[mid] < a) low = mid; else high = mid; mid = (low + high + 1) / 2; if(value[low] == a) { mid = low; break; } } // Print the location. fprintf(fout, "%d\n", mid); } return 0; }