Level AI | Software Engineer | HackerRank OA
Anonymous User
532

🧩 Problem 1: Count Divisible Triplets
You're given:

An integer array arr of length n

An integer div

Your task is to count the number of triplets (i, j, k) such that:

0 ≤ i < j < k < n

(arr[i] + arr[j] + arr[k]) % div == 0

Return the total number of such triplets.

🧩 Problem 2: Signal Activation and Processor Cost
You are given a binary signal array of length n, where all elements are initially set to 0. This array represents inactive signals.

You are also given a ping array of length n which contains a permutation of the integers from 0 to n - 1. This array represents a sequence of signal activations.

🔧 Activation and Processor Behavior
When the processor receives a ping for signal i (i.e., ping[k] == i), it activates the i-th signal by setting signal[i] = 1.

After each activation, the processor performs a sequence of swap operations, with the following rule:

For every index j from 0 to n - 2, if signal[j] == 1 and signal[j+1] == 0, the processor swaps signal[j] and signal[j+1].

The processor continues to do this until no more such swaps are possible.

Each individual swap operation costs 1 unit.

🎯 Task
For each ping (activation), return the total number of swap operations (i.e., the cost) performed by the processor after that activation.

#include <iostream>
#include <vector>
#include <set>
using namespace std;

class SegmentTree {
    int size;
    vector<int> tree;

    void update(int node, int l, int r, int idx, int val) {
        if (l == r) {
            tree[node] = val;
            return;
        }
        int mid = (l + r) / 2;
        if (idx <= mid)
            update(2 * node, l, mid, idx, val);
        else
            update(2 * node + 1, mid + 1, r, idx, val);
        tree[node] = tree[2 * node] + tree[2 * node + 1];
    }

    int query(int node, int l, int r, int ql, int qr) {
        if (ql > r || qr < l) return 0;
        if (ql <= l && r <= qr) return tree[node];
        int mid = (l + r) / 2;
        return query(2 * node, l, mid, ql, qr) + query(2 * node + 1, mid + 1, r, ql, qr);
    }

public:
    SegmentTree(int n) : size(n), tree(4 * n, 0) {}

    void update(int idx, int val) {
        update(1, 0, size - 1, idx, val);
    }

    int query(int l, int r) {
        return query(1, 0, size - 1, l, r);
    }
};

vector<int> optimizedWithSegmentTree(const vector<int>& queries) {
    int n = queries.size();
    SegmentTree seg(n);
    set<int> zeroSet;
    vector<int> result;

    for (int i = 0; i < n; ++i)
        zeroSet.insert(i);
    int ones=0;
    
    for (int idx : queries) {
        zeroSet.erase(idx-1);
        seg.update(idx-1, 1);
        ones++;

        if (zeroSet.empty()) {
            result.push_back(1);
        } else {
            int rightmostZero = *zeroSet.rbegin();
            result.push_back(ones - seg.query(rightmostZero + 1, n - 1) + 1);
        }
    }

    return result;
}

int main() {
    vector<int> queries = {2, 1, 3, 4, 6, 5};
    // 0 0 0 0 0 0
    // 1 1 0 0 0 0
    // 1 1 1 0 0 0
    // 1 1 1 1 0 0
    // 1 1 1 1 0 1
    vector<int> result = optimizedWithSegmentTree(queries);

    for (int x : result)
        cout << x << " ";
    cout << endl;

    return 0;
}

For second question, I was able to comeup with this solution after OA completion.
In OA, I passed all test cases for 1st Question (15/15).
For 2nd Question, Brute Force (9/15).

Comments (2)