In this HackerEarth Micro and Array Function problem solution Micro has made a breakthrough. He made a function which he proudly calls Micro's Array Fucntion. It takes an array of integers A and an integer K as input and optimally finds out the number of unordered pairs (i,j),i != j such that A[i] - A[j] >= K.
Micro is getting a lot of recognition because of it. His best friend Mike wants to be a part of it, but for that he needs to make some contribution. He thought of extending Micro's Array function. He wants to make a new function g(A,K) that also takes an array of integers A and an integer K as input and optimally calculates Sigma F(X,K) for all contiguous subarrays X of A. He need your help in this and help here means do the entire task. He'll give you an integer K and an array A having N integers and you need to compute g(A,K).

HackerEarth Micro and Array Function problem solution

HackerEarth Micro and Array Function problem solution.

#define ll long long
using namespace std;

ll bit[2][300100];
inline void init(){
    memset(bit, 0, sizeof(bit));
void update(int val, int x, int idx){
    while(x <= 3e5){
        bit[idx][x] += val;
        x += (x&(-x));

ll query(int x, int idx){
    ll ret = 0;
        ret += bit[idx][x];
        x -= (x&(-x));
    return ret;
struct node{
    int x, i, j;
    node(int x, int i, int j){
        this->x = x;
        this->i = i;    
        this->j = j;

bool compare(node a, node b){
    return a.x < b.x;
int a[3][300100]={0};
int main(){
    int t;
        map<ll, int> m;
        int n, k; cin>>n>>k;
        vector<node> v;
        for(int i=1; i<=n; i++){
            int temp;cin>>temp;
            v.push_back(node(temp, i, 0));
            v.push_back(node(temp-k, i, 1));
            v.push_back(node(temp+k, i, 2));    
        sort(v.begin(), v.end(), compare);
        int cnt = 0;
        for(int i=0; i<v.size(); i++){
            if(!i or v[i].x != v[i-1].x)cnt++;
            a[v[i].j][v[i].i] = cnt;

        ll ans = 0;
        for(int i=1; i<=n; i++){
            ll sum = 0;
            sum += query(a[1][i], 0);
            sum += query(3e5-a[2][i]+1, 1);
            update(i, a[0][i], 0);
            update(i, 3e5-a[0][i]+1, 1);
            ans += (sum*(n-i+1));
    return 0;

Second solution

using namespace std;
#define fre     freopen("in.txt","r",stdin);//freopen("0.out","w",stdout)
#define abs(x) ((x)>0?(x):-(x))
#define MOD 1000000007
#define LL signed long long int
#define scan(x) scanf("%d",&x)
#define print(x) printf("%d\n",x)
#define scanll(x) scanf("%lld",&x)
#define printll(x) printf("%lld\n",x)
#define rep(i,from,to) for(int i=(from);i <= (to); ++i)
#define pii pair<int,int>
#define MAXN 200000
vector<int> G[2*100000+5];
int N, K;
LL tree[MAXN+5];
LL read(LL *bit,int idx){
    LL sum = 0;
        return 0;
    while (idx > 0){
        sum += bit[idx];
        idx -= (idx & -idx);
    return sum;
void update(LL *bit,int idx ,int val){
    while (idx <= MAXN){
        bit[idx] += val;
        idx += (idx & -idx);
LL calc(int *A){
    rep(i,1,MAXN)tree[i] = 0;
    LL ans = 0;
    for(int i=1;i<=N;++i){
        ans += read(tree, mp[A[i]-K]) * (N-i+1);
        update(tree, mp[A[i]], i);
    return ans;
int A[100000+5];
int main(){
    int T;
            V.push_back(A[i] - K);
        for(int i=0;i<V.size();++i){
            mp[V[i]] = i+1;
        LL ans = 0;
        ans = calc(A);
        ans = ans + calc(A);