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 0001 ≤ Q ≤ 100 0001 ≤ a[i] ≤ 1 000pentru 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;
}