1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
using namespace std;

long long przytnij_trawe(int &, int, int, int);

int main()
{
  int liczba_arow = 0; // 1 : 500 000
  int liczba_skoszen = 0; // 1 : 500 000
  int pole[500000];
  int szybkosc_wzrostu[500000]; // 1 : 1 000 000
  long long waga_siana = 0;
  int poprzedni_dzien = 0;
  int obecny_dzien = 0; //1 : 10^12
  int wysokosc_przyciecia = 0; //1 : 10^12
  int poIluDniach = 0;
  
  cin >> liczba_arow >> liczba_skoszen;
  int liczba_gatunkow_trawy = liczba_arow;
  
  for(int gatunek_trawy = 0; gatunek_trawy < liczba_gatunkow_trawy; gatunek_trawy++)
      cin >> szybkosc_wzrostu[gatunek_trawy];
      
  for(int koszenie = 0; koszenie < liczba_skoszen; koszenie++)
  {
      waga_siana = 0;
      cin >> obecny_dzien >> wysokosc_przyciecia;
      
      poIluDniach = obecny_dzien - poprzedni_dzien;
      
      for(int gatunek_trawy = 0; gatunek_trawy < liczba_gatunkow_trawy; gatunek_trawy++)
        waga_siana += przytnij_trawe(pole[gatunek_trawy], szybkosc_wzrostu[gatunek_trawy], poIluDniach, wysokosc_przyciecia);
      
      cout << waga_siana << endl;
      
      poprzedni_dzien = obecny_dzien;
  }

  return 0;
}

long long przytnij_trawe(int& wysokosc_trawy, int szybkosc_wzrostu, int poIluDniach, int wysokosc_przyciecia)
{
    //cout << wysokosc_trawy << " " << szybkosc_wzrostu << " " << poIluDniach << " " << wysokosc_przyciecia << endl;
    wysokosc_trawy += szybkosc_wzrostu * poIluDniach;
    
    if(wysokosc_trawy > wysokosc_przyciecia)
    {
        long long waga_siana = wysokosc_trawy - wysokosc_przyciecia;
    	wysokosc_trawy = wysokosc_przyciecia;
    	return waga_siana;
    }
    else
    {
    	return 0LL;
    }
}