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
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <iostream>
#include <sstream>
#include <string>
#include <map>
using namespace std;

enum granice
{
    l_zolty = 2, //zamiast średników stosuje się przecinki
    r_zolty = 3,
    l_niebieski = 4,
    r_niebieski = 5,
    l_czerwony = 6,
    r_czerwony = 7
};
main (int arc, char ** argv) {

    int n,m,suma = 0;
    cin >> n >> m;
    //cout << m << " " << n << '\n';

    std::multimap<int, granice> rzad_puszek;
    for (int i = 0; i < m; i++)
    {
        int l,r,k = 0;
        cin >> l >> r >> k;
        //cout << l << " " << r << " " << k << '\n';

        rzad_puszek.insert(pair <int, granice> (l, static_cast<granice>(2*k)));
        rzad_puszek.insert(pair <int, granice> (r+1, static_cast<granice>(2*k+1)));
    }

    multimap <int, granice> :: iterator itr;
    //for (itr = rzad_puszek.begin(); itr != rzad_puszek.end(); ++itr)
    //{
    //    cout  <<  '\t' << itr->first
    //          <<  '\t' << itr->second << '\n';
    //}

    int zolty = 0;
    int niebieski = 0;
    int czerwony = 0;
    int zielony = 0;

    for (itr = rzad_puszek.begin(); itr != rzad_puszek.end(); ++itr)
    {
        //cout  <<  '\t' << itr->first
        //      <<  '\t' << itr->second << '\n';

        switch( itr->second )
        {
        case l_zolty:
            if ((zolty == 0) && (niebieski > 0) && (czerwony == 0)) {
                zielony = itr->first;
                //cout << "zielony:" << zielony <<'\n';
            }
            zolty++;
            //cout << "zolty:" << zolty <<'\n';
            break;
        
        case r_zolty:
            if ((zolty == 1) && (niebieski > 0) && (czerwony == 0)) {
                suma += itr->first - zielony;
                //cout << "suma:" << suma <<'\n';
            }
            zolty--;
            //cout << "zolty:" << zolty <<'\n';
            break;
        
        case l_niebieski:
            if ((zolty > 0) && (niebieski == 0) && (czerwony == 0)) {
                zielony = itr->first;
                //cout << "zielony:" << zielony <<'\n';
            }
            niebieski++;
            //cout << "niebieski:" << niebieski <<'\n';
            break;
        
        case r_niebieski:
            if ((zolty > 0) && (niebieski == 1) && (czerwony == 0)) {
                suma += itr->first - zielony;
                //cout << "suma:" << suma <<'\n';
            }
            niebieski--;
            //cout << "niebieski:" << niebieski <<'\n';
            break;
        
        case l_czerwony:
            if ((zolty > 0) && (niebieski > 0) && (czerwony == 0)) {
                suma += itr->first - zielony;
                //cout << "suma:" << suma <<'\n';
            }
            czerwony++;
            //cout << "czerwony:" << czerwony <<'\n';
            break;
        
        case r_czerwony:
            if ((zolty > 0) && (niebieski > 0) && (czerwony == 1)) {
                zielony = itr->first;
                //cout << "zielony:" << zielony <<'\n';
            }
            czerwony--;
            //cout << "czerwony:" << czerwony <<'\n';
            break;
        
        default:
            //jakiś kod
            break;
        }

    }

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