Cod sursa(job #2922501)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 8 septembrie 2022 18:22:17
Problema P-sir Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

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

const int kN = 2e3;
int a[kN];
pair<int, int> v[kN];
unsigned dp[kN][kN];

int main() {
  int n;
  fin >> n;
  for (int i = 0; i < n; ++i) {
    fin >> a[i];
    v[i] = {a[i], i};
  }
  sort(v, v + n);
  unsigned res = 0;
  for (int i = 0; i < n; ++i) {
    int p1 = 0, p2 = 0;
    unsigned s1 = 0, s2 = 0;
    for (int j = 0; j < i; ++j) {
      s1 += dp[j][i];
    }
    for (int j = 0; j < n; ++j) {
      if (i < v[j].second) {
        dp[i][v[j].second] = 1;
        if (a[i] < v[j].first) {
          while (p1 < n && v[p1].first <= v[j].first) {
            s1 -= dp[v[p1].second][i];
            p1 += 1;
          }
          dp[i][v[j].second] += s1;
        } else if (v[j].first < a[i]) {
          while (p2 < n && v[p2].first < v[j].first) {
            s2 += dp[v[p2].second][i];
            p2 += 1;
          }
          dp[i][v[j].second] += s2;
        }
        res += dp[i][v[j].second];
      }
    }
  }
  fout << res << '\n';
  fin.close();
  fout.close();
  return 0;
}