Mai intai trebuie sa te autentifici.
Cod sursa(job #1471844)
Utilizator | Data | 15 august 2015 13:36:25 | |
---|---|---|---|
Problema | P-sir | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.43 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream fin("psir.in");
ofstream fout("psir.out");
#define ui unsigned int
const ui NMAX = 2000 + 10;
const long long MOD = 1LL << 32;
vector < ui > aux;
ui x[NMAX];
ui i , N , j , ans , q;
ui aib[NMAX][NMAX];
inline ui lsb(ui x)
{
return (x & (-x));
}
void update(ui line , ui x , ui p)
{
for ( ; x <= 2000 ; x += lsb(x))
aib[line][x] = (0LL + aib[line][x] + p) % MOD;
}
ui query(ui line , ui x)
{
int ans = 0;
for ( ; x ; x -= lsb(x))
ans = (0LL + ans + aib[line][x]) % MOD;
return ans;
}
int main()
{
fin >> N;
for (i = 1 ; i <= N ; ++i)
{
fin >> x[i];
aux.push_back(x[i]);
//cout << x[i] << " ";
}
//cout << '\n';
sort(aux.begin() , aux.end());
aux.resize(distance(aux.begin() , unique(aux.begin() , aux.end())));
for (i = 1 ; i <= N ; ++i)
{
x[i] = lower_bound(aux.begin() , aux.end() , x[i]) - aux.begin() + 1;
//cout << x[i] << " ";
}
for (i = 1 ; i <= N ; ++i)
for (j = 1 ; j < i ; ++j)
{
//if (x[i] == x[j]) continue;
if (x[i] > x[j])
{
q = (1LL + query(j , 2000) - query(j , x[i])) % MOD;
ans = (0LL + ans + q) % MOD;
update(i , x[j] , q);
}
else
{
q = (1LL + query(j , x[i] - 1)) % MOD;
ans = (0LL + ans + q) % MOD;
update(i , x[j] , q);
}
}
fout << ans << '\n';
return 0;
}