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
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <vector>
#include <set>

using namespace std;

int n, c;
int a[500009], w[500009];
set <int> wszystkie_kolorki;
vector <int> wszystkie_kolorki_v;
vector <vector <int>> d;
int maxyLokalne[500009];
int maxGlobalny;

vector <set <int>> v;

int va[500009];

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> c;

    for (int i = 0; i < n; i++)
    {
        cin >> a[i] >> w[i];

        if (wszystkie_kolorki.find(w[i]) == wszystkie_kolorki.end())
        {
            wszystkie_kolorki.insert(w[i]);
            wszystkie_kolorki_v.push_back(w[i]);
        }
        
        
        if (i == 0)
        {
            v.push_back(set<int>());
            v[v.size()-1].insert(w[i]);
            va[v.size()-1] = a[i];
        }
        else
        {
            if (a[i] == a[i-1])
            {
                v[v.size()-1].insert(w[i]);
            }
            else
            {
                v.push_back(set<int>());
                v[v.size()-1].insert(w[i]);
                va[v.size()-1] = a[i];
            }
            
        }

    }

    for (int i = 0; i< 2; i++)
    {
        d.push_back(vector<int>());
        for (int j = 0; j< wszystkie_kolorki_v.size(); j++)
        {
            d[i].push_back(0);
        }

    }

    for (int i = v.size()-1; i >= 0; i--)
    {
        for (int j = 0; j < wszystkie_kolorki_v.size(); j++)
        {
            if (v[i].find(wszystkie_kolorki_v[j]) != v[i].end())
            {
                d[i%2][j] = max(d[(i+1)%2][j] + va[i], va[i] + maxyLokalne[i+1] - c);
            }
            else
            {
                d[i%2][j] = d[(i+1)%2][j];
            }
            maxyLokalne[i] = max(maxyLokalne[i], d[i%2][j]);
        }
    }

    for (int i = v.size()-1; i >= 0; i--)
    {
        maxGlobalny = max(maxGlobalny, maxyLokalne[i]);
    }

    cout << maxGlobalny << '\n';
    
    return 0;
}