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> using namespace std; int a[100001] , s[100001] , maxime[100001]; int cb(int a[] , int n , int val) { int st = 1 , dr = n; while (st <= dr) { int mij = (st + dr) / 2; if(val < a[mij]) dr = mij - 1; else st = mij + 1; } return dr; } int main() { int n; cin >> n; for(int i = 1 ; i <= n ; ++i) cin >> a[i] , s[i]=s[i-1]+a[i]; for(int i = 1 ; i <= n ; ++i) if(a[i]>maxime[i-1]) maxime[i]=a[i]; else maxime[i]=maxime[i-1]; int q; cin >> q; int x , p; for(int i = 1 ; i <= q ; ++i) { cin >> x >> p; int val1 = cb(maxime , n , x); int val2 = cb(s , n , p); cout << min(val1 , val2) << endl; } return 0; }