Pagini recente » Cod sursa (job #1396114) | Cod sursa (job #2473398) | Cod sursa (job #1658852) | Cod sursa (job #312078) | Cod sursa (job #751318)
Cod sursa(job #751318)
#include<stdio.h>
#include<algorithm>
#define maxn 2005
using namespace std;
FILE*f=fopen("psir.in","r");
FILE*g=fopen("psir.out","w");
int n,nr;
int v[maxn],N[maxn];
unsigned int aib[maxn][maxn],total[maxn];
inline int cb ( int val ){
int p = 1,m,u = nr;
while ( p <= u ){
m = (p + u)>>1;
if ( N[m] == val ) return m;
if ( N[m] > val ) u = m - 1;
else p = m + 1;
}
return 0;
}
inline int lsb ( int x ){
return x & -x;
}
inline void update_aib ( unsigned int *aib , int poz , unsigned int val ){
while ( poz <= nr ){
aib[poz] += val;
poz += lsb(poz);
}
}
inline unsigned int query_aib ( unsigned int *aib , int poz ){
unsigned int s = 0;
while ( poz > 0 ){
s += aib[poz];
poz -= lsb(poz);
}
return s;
}
int main () {
fscanf(f,"%d",&n);
for ( int i = 1 ; i <= n ; ++i ){
fscanf(f,"%d",&v[i]); N[i] = v[i];
}
sort(N+1,N+n+1);
for ( int i = 1 ; i <= n ; ++i ){
if ( N[i] != N[i-1] ){
N[++nr] = N[i];
}
}
for ( int i = 1 ; i <= n ; ++i ){
v[i] = cb(v[i]);
}
for ( int i = 2 ; i <= n ; ++i ){
for ( int j = 1 ; j < i ; ++j ){
unsigned int now = 1;
if ( v[i] > v[j] ){
now += total[v[j]] - query_aib(aib[v[j]],v[i]);
}
else{
if ( v[i] < v[j] ){
now += query_aib(aib[v[j]],v[i]-1);
}
}
update_aib(aib[v[i]],v[j],now);
total[v[i]] += now;
}
}
unsigned int sol = 0;
for ( int i = 1 ; i <= n ; ++i ){
sol += total[i];
}
fprintf(g,"%u\n",sol);
fclose(f);
fclose(g);
return 0;
}