#include "teatr.h" #include "message.h" #include <bits/stdc++.h> #define luk(n,m) for(int i=n; i<m; ++i) #define maxn 1000010 #define pb(n) push_back(n) #define mp make_pair #define inf 1000000000 #define mod 1000000007 #define mod1 1000696969 #define ll long long #define ff first.first #define fs first.second using namespace std; ll drzewo[3*maxn]; ll tab[maxn]; ll wynik; int r=1048576; void inserty(int x) { --x; x+=r; drzewo[x]++; x/=2; while(x!=0) { drzewo[x]=drzewo[2*x]+drzewo[2*x+1]; x/=2; } } void query(int gdzie, int pp, int pk, int zp, int zk, ll a) { if(zp>pk||zk<pp) return; if(zp<=pp&&zk>=pk) { wynik+=a*drzewo[gdzie]; return; } int sr=(pp+pk)/2; query(2*gdzie, pp, sr, zp, zk,a); query(2*gdzie+1, sr+1, pk, zp, zk,a); } int main() { int n=GetN(); int x=MyNodeId(); int a=x*1000000; int b=(x+1)*1000000; int c=0; luk(a,n) { c=GetElement(i); if(i>=a&&i<b) { query(1,1,r,c+1,1000000,1); inserty(c); } else { tab[c]++; } } luk(1,1000001) { query(1,1,r,i+1,1000000,tab[i]); } if(x==99) { luk(0,99) { Receive(i); wynik+=GetLL(i); } printf("%lld", wynik); } else { PutLL(99,wynik); Send(99); } }
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 | #include "teatr.h" #include "message.h" #include <bits/stdc++.h> #define luk(n,m) for(int i=n; i<m; ++i) #define maxn 1000010 #define pb(n) push_back(n) #define mp make_pair #define inf 1000000000 #define mod 1000000007 #define mod1 1000696969 #define ll long long #define ff first.first #define fs first.second using namespace std; ll drzewo[3*maxn]; ll tab[maxn]; ll wynik; int r=1048576; void inserty(int x) { --x; x+=r; drzewo[x]++; x/=2; while(x!=0) { drzewo[x]=drzewo[2*x]+drzewo[2*x+1]; x/=2; } } void query(int gdzie, int pp, int pk, int zp, int zk, ll a) { if(zp>pk||zk<pp) return; if(zp<=pp&&zk>=pk) { wynik+=a*drzewo[gdzie]; return; } int sr=(pp+pk)/2; query(2*gdzie, pp, sr, zp, zk,a); query(2*gdzie+1, sr+1, pk, zp, zk,a); } int main() { int n=GetN(); int x=MyNodeId(); int a=x*1000000; int b=(x+1)*1000000; int c=0; luk(a,n) { c=GetElement(i); if(i>=a&&i<b) { query(1,1,r,c+1,1000000,1); inserty(c); } else { tab[c]++; } } luk(1,1000001) { query(1,1,r,i+1,1000000,tab[i]); } if(x==99) { luk(0,99) { Receive(i); wynik+=GetLL(i); } printf("%lld", wynik); } else { PutLL(99,wynik); Send(99); } } |