// Code of Martin Nagy (CWM), only debugged by me
#include <iostream>
#include <vector>
using namespace std;
//#define int long long
int T;
// last minute in which the character wasn't bored
//
// special value: if equal to Me.end, means that we got bored and stopped playing
int lastPlayedGlobal;
struct interval {
int beginning;
int end;
};
char intersectionType(interval Me, interval Hano) {
// intersecting and Me.beginning <= Hano.beginning
if (Me.beginning <= Hano.beginning && Me.end >= Hano.beginning) return 'M';
// intersecting and Me.beginning > Hano.begin
if (Me.beginning >= Hano.beginning && Hano.end >= Me.beginning) return 'H';
// no intersection
return 'N';
}
int calcPlayTime(interval Me, interval Hano) {
char iType = intersectionType(Me, Hano);
if (iType == 'N') return 0;
if (iType == 'H') return min(Hano.end, Me.end) - Me.beginning + 1;
if (iType == 'M') {
if (
lastPlayedGlobal + T + 1 >= Hano.beginning
&& /* handle special value: */ lastPlayedGlobal != Me.end
) {
return min(Hano.end, Me.end) - Hano.beginning + 1;
}
else {
lastPlayedGlobal = Me.end;
return 0;
}
}
}
signed main()
{
cin >> T;
int meIntervalCount, hanoIntervalCount;
cin >> meIntervalCount;
vector<interval> meIntervals;
vector<interval> hanoIntervals;
for (size_t i = 0; i < meIntervalCount; i++)
{
int a, b;
cin >> a >> b;
meIntervals.push_back({ a,b });
}
cin >> hanoIntervalCount;
for (size_t i = 0; i < hanoIntervalCount; i++)
{
int a, b;
cin >> a >> b;
hanoIntervals.push_back({ a,b });
}
int hanoIntervalIndex = 0;
int meIntervalIndex = 0;
lastPlayedGlobal = meIntervals[0].beginning - 1;
int MaxPlayTime = 0;
while (true) {
MaxPlayTime += calcPlayTime(meIntervals[meIntervalIndex], hanoIntervals[hanoIntervalIndex]);
if (meIntervals[meIntervalIndex].end >= hanoIntervals[hanoIntervalIndex].end) {
// Hano's planned break ended strictly earlier
// special value handled: always Hano.end < Me.end
if (lastPlayedGlobal < hanoIntervals[hanoIntervalIndex].end)lastPlayedGlobal = hanoIntervals[hanoIntervalIndex].end;
hanoIntervalIndex++;
if (hanoIntervalIndex == hanoIntervalCount) {
cout << MaxPlayTime << "\n";
return 0;
}
}
else {
meIntervalIndex++;
if (meIntervalIndex == meIntervalCount) {
cout << MaxPlayTime << "\n";
return 0;
}
lastPlayedGlobal = meIntervals[meIntervalIndex].beginning - 1;
}
}
}
// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu
// Tips for Getting Started:
// 1. Use the Solution Explorer window to add/manage files
// 2. Use the Team Explorer window to connect to source control
// 3. Use the Output window to see build output and other messages
// 4. Use the Error List window to view errors
// 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
// 6. In the future, to open this project again, go to File > Open > Project and select the .sln file