Pagini recente » Cod sursa (job #379099) | Cod sursa (job #668007) | Cod sursa (job #2295449) | Cod sursa (job #2592255) | Cod sursa (job #2042813)
#include<fstream>
#include<algorithm>
#define mod (1LL << 32)
using namespace std;
unsigned int n, i, j, nr, sol;
long long val;
unsigned int v[2005], w[2005], aib[2005][2005];
ifstream fin("psir.in");
ofstream fout("psir.out");
void update(int t, int x, long long val){
for(; x <= nr; x += (x & -x)){
aib[t][x] = (val + aib[t][x]) & (mod - 1);
}
}
long long query(int t, int x){
long long sum = 0;
for(; x >= 1; x -= (x & -x)){
sum = (sum + aib[t][x]) & (mod - 1);
}
return sum;
}
int main(){
fin>> n;
for(i = 1; i <= n; i++){
fin>> v[i];
w[i] = v[i];
}
sort(w + 1, w + n + 1);
nr = 1;
for(i = 2; i <= n; i++){
if(w[i] != w[nr]){
w[++nr] = w[i];
}
}
for(i = 1; i <= n; i++){
for(j = 1; j <= nr; j++){
if(v[i] == w[j]){
v[i] = j;
}
}
}
for(i = 2; i <= n; i++){
for(j = i - 1; j >= 1; j--){
val = 1;
if(v[i] < v[j]){
val = (val + query(j, v[i - 1]) ) & (mod - 1);
}
else{
if(v[i] > v[j]){
val = (val + query(j, nr) - query(j, v[i]) ) & (mod - 1);
}
}
sol = (val + sol) & (mod - 1);
update(i, v[j], val);
}
}
fout<< sol <<"\n";
return 0;
}