#include "message.h"
#include "teatr.h"
#include "bits/stdc++.h"
using namespace std;
long long wynik,a,zlicz[6],aktzlicz,baza=1024*1024;
int drzewo[2500005];
void sprawdz(int a,int b,int lo,int hi,int v)
{
if(a>hi||b<lo)return;
if(a<=lo&&b>=hi)
{
wynik+=drzewo[v];
return;
}
sprawdz(a,b,lo,(lo+hi)/2,2*v);
sprawdz(a,b,(lo+hi)/2+1,hi,2*v+1);
}
void push(int x)
{
x+=baza;
while(x)
{
drzewo[x]++;
x/=2;
}
}
int main() {
int n = GetN();
if(n<=100000)
{
if(MyNodeId() != 0) return 0;
for(int i=0;i<n;i++)
{
a=GetElement(i);
sprawdz(baza+a+1,2*baza-1,baza,2*baza-1,1);
push(a);
}
}
else
{
for(int i=(max(1,(n/NumberOfNodes())))*MyNodeId();i<min(n,(max(1,(n/NumberOfNodes()))*(MyNodeId()+1)));i++)
{
a=GetElement(i);
for(int j=a+1;j<=5;j++)wynik+=zlicz[j];
zlicz[a]++;
}
if(MyNodeId()==NumberOfNodes()-1)
{
for(int i=min(n,(max(1,(n/NumberOfNodes()))*(MyNodeId()+1)));i<n;i++)
{
a=GetElement(i);
for(int j=a+1;j<=5;j++)wynik+=zlicz[j];
zlicz[a]++;
}
}
for(int i=NumberOfNodes()-1;i>0;i--)
{
if(MyNodeId()==i)
{
PutLL(i-1,wynik);
PutLL(i-1,zlicz[1]);
PutLL(i-1,zlicz[2]);
PutLL(i-1,zlicz[3]);
PutLL(i-1,zlicz[4]);
PutLL(i-1,zlicz[5]);
Send(i-1);
}
if(MyNodeId()==i-1)
{
Receive(i);
wynik+=GetLL(i);
aktzlicz=GetLL(i);
wynik+=aktzlicz*(zlicz[2]+zlicz[3]+zlicz[4]+zlicz[5]);
zlicz[1]+=aktzlicz;
aktzlicz=GetLL(i);
wynik+=aktzlicz*(zlicz[3]+zlicz[4]+zlicz[5]);
zlicz[2]+=aktzlicz;
aktzlicz=GetLL(i);
wynik+=aktzlicz*(zlicz[4]+zlicz[5]);
zlicz[3]+=aktzlicz;
aktzlicz=GetLL(i);
wynik+=aktzlicz*(zlicz[5]);
zlicz[4]+=aktzlicz;
aktzlicz=GetLL(i);
zlicz[5]+=aktzlicz;
}
}
}
if(MyNodeId() == 0) cout << wynik;
}
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 | #include "message.h" #include "teatr.h" #include "bits/stdc++.h" using namespace std; long long wynik,a,zlicz[6],aktzlicz,baza=1024*1024; int drzewo[2500005]; void sprawdz(int a,int b,int lo,int hi,int v) { if(a>hi||b<lo)return; if(a<=lo&&b>=hi) { wynik+=drzewo[v]; return; } sprawdz(a,b,lo,(lo+hi)/2,2*v); sprawdz(a,b,(lo+hi)/2+1,hi,2*v+1); } void push(int x) { x+=baza; while(x) { drzewo[x]++; x/=2; } } int main() { int n = GetN(); if(n<=100000) { if(MyNodeId() != 0) return 0; for(int i=0;i<n;i++) { a=GetElement(i); sprawdz(baza+a+1,2*baza-1,baza,2*baza-1,1); push(a); } } else { for(int i=(max(1,(n/NumberOfNodes())))*MyNodeId();i<min(n,(max(1,(n/NumberOfNodes()))*(MyNodeId()+1)));i++) { a=GetElement(i); for(int j=a+1;j<=5;j++)wynik+=zlicz[j]; zlicz[a]++; } if(MyNodeId()==NumberOfNodes()-1) { for(int i=min(n,(max(1,(n/NumberOfNodes()))*(MyNodeId()+1)));i<n;i++) { a=GetElement(i); for(int j=a+1;j<=5;j++)wynik+=zlicz[j]; zlicz[a]++; } } for(int i=NumberOfNodes()-1;i>0;i--) { if(MyNodeId()==i) { PutLL(i-1,wynik); PutLL(i-1,zlicz[1]); PutLL(i-1,zlicz[2]); PutLL(i-1,zlicz[3]); PutLL(i-1,zlicz[4]); PutLL(i-1,zlicz[5]); Send(i-1); } if(MyNodeId()==i-1) { Receive(i); wynik+=GetLL(i); aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[2]+zlicz[3]+zlicz[4]+zlicz[5]); zlicz[1]+=aktzlicz; aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[3]+zlicz[4]+zlicz[5]); zlicz[2]+=aktzlicz; aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[4]+zlicz[5]); zlicz[3]+=aktzlicz; aktzlicz=GetLL(i); wynik+=aktzlicz*(zlicz[5]); zlicz[4]+=aktzlicz; aktzlicz=GetLL(i); zlicz[5]+=aktzlicz; } } } if(MyNodeId() == 0) cout << wynik; } |
English