Pagini recente » Cod sursa (job #3217579) | Cod sursa (job #3172217) | Cod sursa (job #5493) | Cod sursa (job #203290) | Cod sursa (job #3223988)
#include <bits/stdc++.h>
#ifdef LOCAL
#define in cin
#define out cout
#endif
#define int int64_t
using namespace std;
#ifndef LOCAL
ifstream in("psir.in");
ofstream out("psir.out");
#endif
const int nmax = 2005;
const int MOD = pow(2, 32);
struct elem
{
int32_t val;
int mod;
bool operator<(const elem &other) const
{
return val < other.val;
}
};
int32_t v[nmax];
vector<elem> vals[nmax];
vector<int> sumpart[nmax];
int querypart(int st, int dr, int ind)
{
return (vals[ind][dr].mod - vals[ind][st - 1].mod + MOD) % MOD;
}
int query(int ind, int val)
{
if (vals[ind].size() == 0 || val == v[ind])
{
return 0;
}
else if (val > v[ind])
{
int st = 1, dr = vals[ind].size() - 1;
while (st < dr)
{
int mij = (st + dr) / 2;
if (vals[ind][mij].val > val)
{
dr = mij;
}
else
{
st = mij + 1;
}
}
if (vals[ind][st].val <= val)
{
return 0;
}
else
{
return querypart(st, vals[ind].size() - 1, ind);
}
}
else if (val < v[ind])
{
int st = 1, dr = vals[ind].size() - 1;
while (st < dr)
{
int mij = (st + dr + 1) / 2;
if (vals[ind][mij].val < val)
{
st = mij;
}
else
{
dr = mij - 1;
}
}
if (vals[ind][st].val >= val)
{
return 0;
}
else
{
return querypart(1, st, ind);
}
}
}
int32_t main()
{
int n;
in >> n;
for (int i = 1; i <= n; i++)
{
in >> v[i];
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
vals[i].push_back({0, 0});
for (int j = 1; j < i; j++)
{
int tmp = query(j, v[i]) + 1;
ans += tmp;
ans %= MOD;
vals[i].push_back({v[j], tmp});
}
sort(vals[i].begin(), vals[i].end());
// sumpart[i].push_back(0);
for (int j = 1; j < vals[i].size(); j++)
{
vals[i][j].mod += vals[i][j - 1].mod;
vals[i][j].mod %= MOD;
// sumpart[i].push_back((sumpart[i][j - 1] + vals[i][j].mod) % MOD);
}
}
out << ans;
}