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
#include "bits/stdc++.h"
#include "teatr.h"
#include "message.h"
#define ld uint_fast32_t
#define lld uint_fast64_t

using namespace std;

ld t[2097152];
ld d[1000009];
ld a,n,x,y,z,l,N,MNI;
lld s;



void add(ld p, ld q)
{
	p+=1048576;
	q+=1048576;
	while(p<q)
	{
		if(p&1)
		{
			++t[p];
			p>>=1;
			++p;
		}else
		{
			p>>=1;
		}
		if(q&1)
		{
			
			q>>=1;
		}
		else
		{
			++t[q];
			q>>=1;
			--q;
		}
	}
	if(p==q) ++t[p];
}

ld zap(ld p)
{
	p+=1048576;
	ld q=0;
	while(p)
	{
		q+=t[p];
		p>>=1;
	}
	return q;
}

int main()
{
	//scanf("%d",&n);
	//if(MyNodeId() != 0) return 0;
	MNI=MyNodeId();
	N=GetN(); 
	l=NumberOfNodes();
	n=N/l;
	//n*=MNI;
	x=MNI*n;
	if(MNI==l-1) n+=N%l;
	y=x+n;	
	for(int i=x;i<y;++i)
	{
		//scanf("%d",&a);
		a=GetElement(i);
		s+=zap(a);
		++d[a-1];
		add(0,a-1);
	}
	
	for(int i=999999;i>0;--i)
	{
		d[i]+=d[i+1];
	}
	
	for(int i=y;i<N;++i)
	{
		s+=d[GetElement(i)];
	}
	if(MNI!=0) 
	{
		Receive(MNI-1);
		z=GetLL(MNI-1);
	}
	s+=z;
	if(MNI!=l-1) 
	{
		PutLL(MNI+1,s);
		Send(MNI+1);
	}
	else printf("%lld",s);
	return 0;
}