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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <teatr.h>
#include<message.h>
#include<bits/stdc++.h>

using namespace std;

pair<int, int> tab[1000005];
long long ile[6];
const int m=(1e6);
#define f first
#define s second

int main()
{

    int ID=MyNodeId();
    long long n = GetN();

    if(n<(ID-1)*m)
    {
        return 0;
    }
    if(ID==0)
    {
        return 0;
    }

    long long w=0;
    int j=0;

    if(n*m>(ID+1)*m)
    {
        int iloczyn=n*m;


        for(long long i=(ID-1)*m; i<n; i++)
        {
            tab[j].f=GetElement(i);
            if(tab[j].f<=5)
            ile[tab[j].f]++;
            tab[j].s=j;
            j++;
        }

        sort(tab, tab+n);

        for(int i=0; i<n; i++)
        {
            if(tab[i].s-i>=0)
                w+=max(tab[i].s-i, 1);
        }

    }
    else
    {
        int j=0;

        for(long long i=(ID-1)*m; i<ID*m; i++)
        {
            tab[j].f=GetElement(i);
            if(tab[j].f<=5)
            ile[tab[j].f]++;
            tab[j].s=j;
            j++;
        }

        sort(tab, tab+m);

        for(int i=0; i<m; i++)
        {
            if(tab[i].s-i>=0)
                w+=max(tab[i].s-i, 1);
        }

    }

    int x;

    if(ID!=1)
    {

        Receive(ID-1);

        x=GetInt(ID-1);
        w+=ile[1]*x;
        ile[1]+=x;

        x=GetInt(ID-1);
        w+=x*(ile[1]+ile[2]);
        ile[2]+=x;

        x=GetInt(ID-1);
        w+=x*(ile[1]+ile[2]+ile[3]);
        ile[3]+=x;

        x=GetInt(ID-1);
        w+=x*(ile[1]+ile[2]+ile[3]+ile[4]);
        ile[4]+=x;

        x=GetInt(ID-1);
        w+=x*(ile[1]+ile[2]+ile[3]+ile[4]+ile[5]);
        ile[5]+=x;

        w+=GetLL(ID-1);

    }

    if(ID!=n/m+1)
    {

        PutInt(ID+1, ile[1]);
        PutInt(ID+1, ile[2]);
        PutInt(ID+1, ile[3]);
        PutInt(ID+1, ile[4]);
        PutInt(ID+1, ile[5]);

        PutLL(ID+1, w);

        Send(ID+1);

    }


    if(ID==n/m+1)
    {
        cout<<w;
    }

    return 0;
}