#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <map> 
#include <string>
#include <vector>  
#include <iostream> 
#include <sstream> 
#include <queue>
#include <algorithm> 
#include <assert.h>
#include "teatr.h"
#include "message.h"

using namespace std;

#define ll long long
#define PB 		push_back
#define FOR(a,start,end) 	for(int a=int(start); a<int(end); a++)
#define INF 		INT_MAX
#define SORT(a) 	sort(a.begin(),a.end()) 
#define CL(a,x) 		memset(a,x,sizeof(a))
#define REP(a,x)	for(int a=0;a<x;a++)
#define REP1(a,x)	for(int a=1;a<=x;a++)
#define MP 		make_pair



typedef vector<int>     vi;
typedef pair<int, int>     pii;
typedef vector<string> vs;
typedef vector<pii> vii;
typedef vector<vector<int> > vvi;
typedef vector<vector<string> > vvs;
typedef vector<pair<string, string> > vss;
typedef pair<string, string> pss;
typedef pair<int, pii> ppii;
typedef vector<ppii> vppii;
typedef vector<vector<pii> > vvii;
typedef vector<vvi> vvvi;


int nz;
int m, n, k, a, b, c, d,ib;
ll z, z0;
vi vk;
vvi vvk;

int bs(int a) {
	
	int k1 = 0;
	int k2 = vk.size() - 1;
	if (a < vk[k1]) {
		vk.insert(vk.begin(), a);
		return 0;
	}
	if (a > vk[k2]) {
		vk.push_back(a);
		return vk.size() - 1;
	}
	k = (k1 + k2) / 2;
	while (k2 - k1 > 1) {
		if (vk[k] < a)
			k1 = k;
		else
			k2 = k;
	}
	vk.insert(vk.begin() + k2, a);
	return k2;

}
int main() {
	//freopen( "c:\\wojtek\\uva\\pa\\debug\\t1.in", "rt", stdin);  

	//pi=2*acos(0.0);

	m = MyNodeId();
	nz = (ll)NumberOfNodes();

	
	//	if(m==4){
	//		cerr<<"m = "<<m<<" nz = "<<nz<<" w = "<<w<<" h = "<<h<<endl;
	//	}
	n = GetN();
	if (n <= 1000) {
		if (m == 0) {
			int kmax = 1;
		//	cerr << "jestem 0" << endl;
		//	cerr << "n = " << n << endl;
			vk.clear();
			vvk.assign(1000001, vk);
			for (int i = 0; i < n; i++) {
				k = GetElement(i);
				kmax = max(kmax, k);
				
				vvk[k].push_back(i);
				
			}
			

			int i = 1;
			while (vvk[i].size() == 0)
				i++;
			
			vk = vvk[i];
			
			z = 0;
			for (int j = 0; j < vk.size(); j++) {
				z += vk[j] - j;
			}
		
			i++;
			for (; i <= kmax; i++) {
				for (int j = 0; j < vvk[i].size(); j++) {
					
					z += vvk[i][j] - bs(vvk[i][j]);
					
				}
			
			}
			cout << z << endl;
		}

	}
	else {
		k = n / nz;    //ile rzędów w każdej instancji
		//cerr << "instancja nr = "<<m << endl;
		int k1 = m * k;
		int k2 = (m + 1)*k - 1;
		if (m == nz - 1)
			k2 = n - 1;
		int kmax = 1;
		vk.clear();
		vvk.assign(1000001, vk);
		//cerr << "k1/k2 = " << k1 << " " << k2 << endl;
		for (int i = k1; i <= k2; i++) {
			k = GetElement(i);
			vvk[k].push_back(i);
			kmax = max(kmax, k);
		}
		//cerr <<m<< " odczytałem " << endl;
		//cerr << "kmax = " << kmax << endl;
		ib = 1;
		while (vvk[ib].size() == 0)
			ib++;
		vk = vvk[ib];
		z = 0;
		for (int j = 0; j < vk.size(); j++) {
			z += vk[j] - j-k1;
		}
		/*
		if (m == 9) {
			for (int ix = 0; ix < vk.size(); ix++)
				cerr << "vk[ix] = " << vk[ix] << " ";
			cerr << endl;
		}
		if (m == 9)
			cerr << "z = " << z << endl;
			*/
		ib++;
		//if (m == 9)
		//	cerr << "i0 = " << ib << endl;
		for (int ia=ib; ia<=kmax; ia++) {
			
		//	if (m == 9)
		//		cerr << "ia = " << ia << " ";
			for (int j = 0; j < vvk[ia].size(); j++) {
				z += vvk[ia][j] - bs(vvk[ia][j])-k1;
			}
			
		}
		if (m == 5)
		//		cerr << endl;
			cerr <<m<< "policzyłem" << endl;
		if (kmax <= 1000) {
			vi vk0;
			vk0.assign(kmax, 0);
			if (m < nz - 1) {


				Receive(m + 1);
				int k0 = GetInt(m + 1);
				vi vk0;
				vk0.assign(k0, 0);
				for (int i = 1; i <= k0; i++) {
					vk0[i] = GetInt(m + 1);
				}
				Receive(m + 1);
				ll z0 = GetLL(m + 1);
				z += z0;
			//	cerr << m << "dostałemm" << endl;
				for (int i = 0; i < k0; i++) {
					b = k2 - k1 + 1;
					for (int j = 1; j <= kmax; j++) {
						b -= vvk[j].size();
						z += vk0[i] * b;
					}
				}
			}
			if (m > 0) {
				for (int i = 0; i < max((int)vk0.size(), kmax - 1); i++)
					vk0[i] += vvk[i + 1].size();
				PutInt(m - 1, (int)vk0.size());
				for (int i = 0; i < vk0.size(); i++)
					PutInt(m - 1, vk0[i]);
				Send(m - 1);
				PutLL(m - 1, z);
				Send(m - 1);
				//cerr << m << "wysłałem" << endl;
			}
			else
				cout << z << endl;
		}

	}
	

	//czas = clock() - czas;
	//printf("%lf\n",double(czas)/CLOCKS_PER_SEC);					
	//}

	return 0;

}
