Cod sursa(job #3224975)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 16 aprilie 2024 18:14:35
Problema P-sir Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#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;
}