Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define sc(a) scanf("%d", &a)
  6. #define sc2(a,b) scanf("%d %d", &a, &b)
  7. #define pri(x) printf("%d\n", x)
  8. #define prie(x) printf("%d ", x)
  9. #define sz(x) (int)((x).size())
  10. #define mp make_pair
  11. #define pb push_back
  12. #define f first
  13. #define s second
  14. #define sq(x) ((x)*(x))
  15. #define BUFF ios::sync_with_stdio(false)
  16.  
  17. typedef long long int ll;
  18. typedef pair<int, int> ii;
  19. typedef vector<int> vi;
  20. typedef vector<vi> vvi;
  21. typedef vector<ii> vii;
  22. const int INF = 0x3f3f3f3f;
  23. const ll LINF = 0x3f3f3f3f3f3f3f3fll;
  24.  
  25. #define MAX 1000010
  26. ll seg1[2*MAX];
  27. ll seg2[2*MAX];
  28. int n;
  29.  
  30. void build() {
  31.     for (int i = 0; i <= 2*n; i++) seg1[i] = 0;
  32.     for (int i = 0; i <= 2*n; i++) seg2[i] = 0;
  33. }
  34.  
  35. ll sum1(int a, int b) {
  36.     ll ret = 0;
  37.     for (a += n, b += n; a <= b; ++a/=2, --b/=2) {
  38.         if (a%2 == 1) ret += seg1[a];
  39.         if (b%2 == 0) ret += seg1[b];
  40.     }
  41.     return ret;
  42. }
  43.  
  44. ll sum2(int a, int b) {
  45.     ll ret = 0;
  46.     for (a += n, b += n; a <= b; ++a/=2, --b/=2) {
  47.         if (a%2 == 1) ret += seg2[a];
  48.         if (b%2 == 0) ret += seg2[b];
  49.     }
  50.     return ret;
  51. }
  52.  
  53. void update1(int p, int x) {
  54.     seg1[p += n] += x;
  55.     while (p /= 2) seg1[p] = seg1[2*p] + seg1[2*p+1];
  56. }
  57.  
  58. void update2(int p, int x) {
  59.     seg2[p += n] += x;
  60.     while (p /= 2) seg2[p] = seg2[2*p] + seg2[2*p+1];
  61. }
  62.  
  63. int main() {
  64.     while (sc(n) != EOF) {
  65.         int v[n];
  66.         for (int i = 0; i < n; i++) sc(v[i]);
  67.  
  68.         build();
  69.  
  70.         ll out = 0;
  71.         for (int i = 0; i < n; i++) {
  72.             update1(v[i], 1);
  73.             ll a;
  74.             if (v[i] == n) a = 0;
  75.             else a = sum1(v[i] + 1, n);
  76.             update2(v[i], a);
  77.             if (v[i] != n)
  78.                 out += sum2(v[i] + 1, n);
  79.         }
  80.         printf("%lld\n", out);
  81.     }
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement