Se consideră un șir de numere naturale nenule a[1]
, a[2]
, …, a[n]
. Asupra șirului se efectuează Q
interogări. Fiecare interogare este dată de o pereche (x, s)
: care este indicele maxim p
cu proprietatea că a[i] ≤ x
, pentru orice i=1..p
și în plus a[1] + a[2] + ... + a[p] <= s
?
Cerința
Trebuie să răspundeți la fiecare din cele Q
întrebări.
Date de intrare
Programul citește de la tastatură numărul n
, iar apoi n
numere naturale, separate prin spații, reprezentând elementele șirului. Apoi se citește valoarea Q
și la final se citesc Q perechi de forma (x, s)
reprezentând întrebările.
Date de ieșire
Programul va afișa pe câte o linie la ecran Q
valori reprezentând răspunsurile la întrebări.
Restricții și precizări
1 ≤ n ≤ 100 000
1 ≤ Q ≤ 100 000
1 ≤ a[i] ≤ 1 000
pentru oricei=1..n
- pentru fiecare întrebare,
1 ≤ x, s ≤ 1 000 000 000
Exemplu
Intrare
9 5 3 1 7 4 9 8 2 6 6 8 10 4 20 6 20 6 8 10 100 10 20
Ieșire
3 0 3 2 9 5
Explicație
La prima întrebare, x=8
, s=10
. Indicele maxim este 3
pentru că primele trei valori din șir sunt mai mici sau egale cu 8
, iar 5 + 3 + 1 ≤ 10
.
La a doua întrebare, răspunsul este 0
deoarece primul număr din șir este 5
care este mai mare decât x=4
.
La a cincea întrebare, x=10
și s=100
. Răspunsul este chiar lungimea șirului.
#include <bits/stdc++.h> #define nmax 100005 using namespace std; int a[nmax], M[nmax], n; int CautBin(int x, int s) { int st, dr, p, mid; if (x < M[1]) return 0; if (x >= M[n] && s >= a[n]) return n; st = 1; dr = n; p = 0; while (st <= dr) { mid = (st + dr) / 2; if (x < M[mid] || s < a[mid]) dr = mid - 1; else { p = mid; st = mid + 1; } } return p; } int main() { int i, Q, x, s; cin >> n; for (i = 1; i <= n; i++) cin >> a[i]; /// maxime partiale M[1] = a[1]; for (i = 2; i <= n; i++) M[i] = max(M[i - 1], a[i]); /// sume partiale for (i = 2; i <= n; i++) a[i] += a[i - 1]; /// interogarile cin >> Q; while (Q--) { cin >> x >> s; cout << CautBin(x, s) << "\n"; } return 0; }