Pagini recente » Cod sursa (job #1778280) | Cod sursa (job #825990) | Cod sursa (job #2277796) | Cod sursa (job #1603862) | Cod sursa (job #2439198)
#include <fstream>
#include <algorithm>
#include <cstring>
#define DIM 2010
#define MOD (1LL<<32)
using namespace std;
ifstream fin ("psir.in");
ofstream fout ("psir.out");
int v[DIM],w[DIM],aib[DIM];
int n,i,j,k;
long long sol;
int cautare_binara (int v[], int n, int val){
int st = 1, dr = n;
while (st <= dr){
int mid = (st+dr)/2;
if (v[mid] == val)
return mid;
if (v[mid] < val)
st = mid+1;
else dr = mid-1;
}}
void update (int p, int val){
for (;p<=k;p+=(p&-p))
aib[p] += val;
}
int query (int p){
int sol = 0;
for (;p;p-=(p&-p))
sol += aib[p];
return sol;
}
int main (){
fin>>n;
for (i=1;i<=n;i++){
fin>>v[i];
w[i] = v[i];
}
sort (w+1,w+n+1);
k = 1;
for (i=2;i<=n;i++)
if (w[i] != w[i-1])
w[++k] = w[i];
for (i=1;i<=n;i++)
v[i] = cautare_binara (w,k,v[i]);
for (i=3;i<=n;i++){
memset (aib,0,sizeof aib);
update (v[1],1);
for (j=2;j<i;j++){
if (v[i] < v[j]){
sol = (sol + query (v[i]-1));
if (sol >= MOD)
sol -= MOD;
}
if (v[i] > v[j]){
sol = (sol + (j-1)-query(v[i]));
if (sol >= MOD)
sol -= MOD;
}
update (v[j],1);
}}
sol = (sol + 1LL*n*(n-1)/2);
while (sol >= MOD)
sol -= MOD;
fout<<sol;
return 0;
}