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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <vector>

using namespace std;

class Ar {
public:
    Ar(int szybkosc) : wysokosc_(0), szybkosc_(szybkosc) {}
    long long Skos(long long dni_rosniecia, long long dlugosc);

 private:
    void Urosnij(long long dni_rosniecia);

    long long wysokosc_;
    const int szybkosc_;
};

long long Ar::Skos(long long dni_rosniecia, long long dlugosc)
{
    Urosnij(dni_rosniecia);

    long long sciete = 0;
    if (wysokosc_> dlugosc) {
        sciete = wysokosc_ - dlugosc;
        wysokosc_ = dlugosc;
    }

    return sciete;
}

void Ar::Urosnij(long long dni_rosniecia)
{
    wysokosc_ += dni_rosniecia * szybkosc_;
}

class Pole {
public:
    Pole(int ile_pol);
    void DodajAr(int szybkosc);
    long long Skos(long long dzien, long long dlugosc);

private:
    long long ostatni_dzien_;
    vector<Ar> ary;
};

Pole::Pole(int ile_pol) : ostatni_dzien_(0) {
    ary.reserve(ile_pol);
}

void Pole::DodajAr(int szybkosc)
{
    ary.push_back(Ar(szybkosc));
}

long long Pole::Skos(long long dzien, long long dlugosc)
{
    long long suma = 0;
    long long dni_rosniecia = dzien - ostatni_dzien_;
    ostatni_dzien_ = dzien;

    for (Ar& ar : ary) {
        suma += ar.Skos(dni_rosniecia, dlugosc);
    }
    return suma;
}

int main() {
    int ile_pol, ile_koszen;
    cin >> ile_pol >> ile_koszen;

    Pole pole(ile_pol);
    for (int p = 0; p < ile_pol; ++p) {
        int szybkosc;
        cin >> szybkosc;
        pole.DodajAr(szybkosc);
    }

    for (int k = 0; k < ile_koszen; ++k) {
        long long dzien;
        long long dlugosc;
        cin >> dzien >> dlugosc;
        cout << pole.Skos(dzien, dlugosc) << "\n";
    }
}