Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int n;
- int arr[1000000];
- long long tree[4*1000000];
- void merge(long long &node, long long L, long long R)
- {
- node=L+R;
- }
- void build(int node, int L, int R)
- {
- if(L==R)
- {
- tree[node]=0;
- }
- else
- {
- int mid=(L+R)/2;
- build(2*node,L,mid);
- build(2*node+1,mid+1,R);
- merge(tree[node],tree[2*node],tree[2*node+1]);
- }
- }
- long long query(int node, int L, int R, int _left, int _right)
- {
- //iLRj
- if(L>=_left && R<=_right)
- {
- return tree[node];
- }
- if(L>_right || R<_left)
- {
- return 0;
- }
- int mid=(L+R)/2;
- long long left=query(2*node, L, mid, _left, _right);
- long long right=query(2*node+1,mid+1,R,_left,_right);
- return left+right;
- }
- void update(int node, int L, int R, int index)
- {
- if(L==R)
- {
- tree[node]=1;
- return;
- }
- int mid=(L+R)/2;
- if(index>mid)
- {
- update(2*node+1, mid+1, R, index);
- }
- else
- {
- update(2*node, L, mid, index);
- }
- merge(tree[node],tree[2*node],tree[2*node+1]);
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- vector<pair<int, int> > v;
- cin>>n;
- int mxx = 0;
- for(int i=0; i<n; i++)
- {
- cin>>arr[i];
- v.push_back(make_pair(arr[i], i));
- }
- sort(v.begin(), v.end());
- build(1,0,n + 1);
- vector<long long> cnt1;
- long long total=0;
- for(int i=n-1; i>=0; i--)
- {
- update(1,0,n + 1,v[i].second);
- cnt1.push_back(query(1,0,n + 1,0,v[i].second-1));
- }
- build(1, 0, n + 1);
- vector<long long > cnt2;
- reverse(cnt1.begin(), cnt1.end());
- for(int i = 0; i < n; ++i) {
- update(1, 0, n + 1, v[i].second);
- total += cnt1[i] * query(1, 0, n + 1, v[i].second + 1, n + 1);
- }
- cout<<total<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement