1870 - Easy xy

From Bitnami MediaWiki
Revision as of 07:47, 4 June 2024 by Danciu (talk | contribs) (Pagină nouă: = Cerința = Se dă un vector <code>v</code> cu <code>N</code> elemente numere naturale numerotate de la <code>1</code> la <code>N</code> și <code>M</code> întrebări de forma: * <code>x y p</code>: se afișează valoarea ce s-ar afla pe poziția <code>p</code> dacă <code>v[x...y]</code> ar fi ordonat crescător. Să se răspundă la cele <code>M</code> întrebări. = Date de intrare = Fișierul de intrare <code>easyxy.in</code> conține pe prima linie numerele <code>N...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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ția p 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>