Cod sursa(job #2730379)

Utilizator PetyAlexandru Peticaru Pety Data 26 martie 2021 10:49:59
Problema P-sir Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>
#define ll long long
#define ld long double

using namespace std;

const ll mod = (1ll << 32);
const ll INF = 1e16;  

ifstream fin ("psir.in");
ofstream fout ("psir.out");

ll n, v[2002], a[2002];
ll dp[2002][2002], ans;
ll aib[2002][2002];

ll add (ll a, ll b) {
  a += b;
  if (a < 0)
    a -= mod;
  if (a >= mod)
    a -= mod;
  return a;
}

ll query (int lol, int x) {
  ll s = 0;
  for (int i = x; i; i -= (i & -i))
    s = add(s, aib[lol][i]);
  return s;
}


void update (int lol, int x, ll val) {
  for (int i = x; i <= n; i += (i & -i))
    aib[lol][i] = add(aib[lol][i], val);
}

int main()   
{
  fin >> n;
  for (int i = 1; i <= n; i++) {
    fin >> v[i];
    a[i] = v[i];
  }
  sort(a + 1, a + n + 1);
  for (int i = 1; i <= n; i++)
    v[i] = lower_bound(a + 1, a + n + 1, v[i]) - a;
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) {
      if (v[i] == v[j]) {
        ans = add(ans, 1);
        continue;
      }
      if (v[i] > v[j]) {
        dp[i][j] = add(dp[i][j], query(i, v[j] - 1));
      }
      else 
        dp[i][j] = add(dp[i][j], (query(i, n) - query(i, v[j]) + mod) % mod);
      dp[i][j] = add(dp[i][j], 1);
      dp[i][j] %= mod;
      update(j, v[i], dp[i][j]);
      ans = add(ans, dp[i][j]);
    }
  fout << ans << "\n";
  return 0;
}