Pagini recente » Cod sursa (job #538261) | Cod sursa (job #186265) | Cod sursa (job #2219927) | Cod sursa (job #1479099) | Cod sursa (job #3224975)
#include <bits/stdc++.h>
#ifdef LOCAL
#define in cin
#define out cout
#endif
#define int uint32_t
using namespace std;
#ifndef LOCAL
ifstream in("psir.in");
ofstream out("psir.out");
#endif
const int nmax = 2005;
struct elem
{
int val;
int mod;
bool operator<(const elem &other) const
{
return val < other.val;
}
};
int v[nmax];
vector<elem> vals[nmax];
int querypart(int st, int dr, int ind)
{
return (vals[ind][dr].mod - vals[ind][st - 1].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;
vals[i].push_back({v[j], tmp});
}
sort(vals[i].begin(), vals[i].end());
for (int j = 1; j < vals[i].size(); j++)
{
vals[i][j].mod += vals[i][j - 1].mod;
}
}
out << ans;
}