1870 - Easy xy
Cerința[edit | edit source]
Se dă un vector v
cu N
elemente numere naturale numerotate de la 1
la N
și M
întrebări de forma:
x y p
: se afișează valoarea ce s-ar afla pe pozițiap
dacăv[x...y]
ar fi ordonat crescător.
Să se răspundă la cele M
întrebări.
Date de intrare[edit | edit source]
Fișierul de intrare easyxy.in
conține pe prima linie numerele N
și M
. Pe următoarea linie se află N
elemente ce reprezintă elementele vectorului. Pe următoarele M
linii se află întrebările.
Date de ieșire[edit | edit source]
Fișierul de ieșire easyxy.out
va conține pe fiecare linie i
răspunsul la întrebarea i
, în ordinea în care acestea apar în fișierul de intrare.
Restricții și precizări[edit | edit source]
1 ≤ N,M ≤ 100.000
- Elementele vectorului sunt
≤ 1.000.000.000
- Pentru orice întrebare,
1 ≤ x ≤ p ≤ y ≤ N
Exemplu:[edit | edit source]
easyxy.in
6 3 1 3 2 5 6 3 1 3 2 1 6 5 3 5 4
easyxy.out
2 5 5
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3"> import sys import bisect
def solve_test_case(n, m, arr):
prefix_sums = [0] * (n + 1) for i in range(1, n + 1): prefix_sums[i] = prefix_sums[i - 1] + arr[i - 1]
for _ in range(m): x, y, p = map(int, input().split())
total_sum = prefix_sums[y] - prefix_sums[x - 1]
left = 0 right = total_sum
while left <= right: mid = (left + right) // 2
count_less = bisect.bisect_left(prefix_sums, mid)
if count_less < p: left = mid + 1 else: right = mid
answer = right
print(answer)
def main():
n, m = map(int, input().split())
arr = list(map(int, input().split()))
for _ in range(m): solve_test_case(n, m, arr)
if __name__ == "__main__":
sys.stdin = open("easyxy.in") sys.stdout = open("easyxy.out", "w") main() sys.stdin.close() sys.stdout.close()
</syntaxhighlight>