Cod sursa(job #2922504)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 8 septembrie 2022 18:33:31
Problema P-sir Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 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 mid = 0; mid < n; ++mid) {
    int pHigh = 0, pLow = 0;
    unsigned high = 0, low = 0;
    for (int left = 0; left < mid; ++left) {
      high += dp[left][mid];
    }
    for (int j = 0; j < n; ++j) {
      int vRight, right;
      tie(vRight, right) = v[j];
      if (mid < right) {
        dp[mid][right] = 1;
        if (a[mid] < vRight) {
          while (pHigh < n && v[pHigh].first <= vRight) {
            high -= dp[v[pHigh].second][mid];
            pHigh += 1;
          }
          dp[mid][right] += high;
        } else if (vRight < a[mid]) {
          while (pLow < n && v[pLow].first < vRight) {
            low += dp[v[pLow].second][mid];
            pLow += 1;
          }
          dp[mid][right] += low;
        }
        res += dp[mid][right];
      }
    }
  }
  fout << res << '\n';
  fin.close();
  fout.close();
  return 0;
}