0% found this document useful (0 votes)
55 views55 pages

OA Questions

The document contains multiple coding problems and solutions related to algorithms and data structures, including topics like priority queues, GCD, subsequences, and minimum swaps. Each problem is accompanied by a code snippet written in C++. The problems are sourced from various coding platforms and include links for further reference.

Uploaded by

Aftab hussain
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
55 views55 pages

OA Questions

The document contains multiple coding problems and solutions related to algorithms and data structures, including topics like priority queues, GCD, subsequences, and minimum swaps. Each problem is accompanied by a code snippet written in C++. The problems are sourced from various coding platforms and include links for further reference.

Uploaded by

Aftab hussain
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 55

Amazon

Q2
https://www.thejoboverflow.com/p/p2074/

#include <bits/stdc++.h>

using namespace std;


vector<int>fun(int k,vector<int>&arr){
priority_queue<int>pq;
vector<int>left(arr.size(),0);
for(int i = 0;i<arr.size();i++){
if(pq.size()<k){
pq.push(arr[i]);
continue;
}
pq.push(arr[i]);
if(pq.top()==arr[i]){left[i]=1;}
pq.pop();
}
vector<int>right(arr.size(),0);
while(!pq.empty())pq.pop();
for(int i=arr.size();i>=0;i--){
if(pq.size()<k){
pq.push(arr[i]);
continue;
}
pq.push(arr[i]);
if(pq.top()==arr[i]){right[i]=1;}
pq.pop();
}
vector<int>res;
for(int i=0;i<arr.size();i++){
if(left[i]&&right[i])res.push_back(arr[i]);
}
return res;
}
int main()
{
int n,m;
cin>>n>>m;
vector<int>arr;
for(int i=0;i<n;i++){
int temp;
cin>>temp;
arr.push_back(temp);
}
auto res= fun(m,arr);
for(auto it:res)cout<<it<<" ";
return 0;
}

Trilogy Innovations (CodeNation)


1 Special Partition
https://www.thejoboverflow.com/p/p2084/

The maximum of arr[0..n-1] should come in first partition. The max of rest of the array should
come in the next partition.
#include<bits/stdc++.h>

using namespace std;

int main(){
int n;
cin >> n;

priority_queue<pair<int, int>> pq;


for(int i = 0; i < n; i++){
int temp;
cin >> temp;
pq.push({temp, i});
}

vector<int> arr;
int top = -1;
while(!pq.empty()){
auto cur = pq.top(); pq.pop();
if(top < cur.second){
arr.push_back(cur.second);
top = cur.second;
}
}

int m = arr.size();
vector<int> dp(m, 1);

for(int i = m - 2; i >= 0; i--){


dp[i] = dp[i + 1] + (arr[i + 1] - arr[i]) * dp[i + 1];
}

cout << dp[0] << endl;


return 0;

Oracle

1 Female Codebreaker
TheJobOverflow | Oracle, New coding question | Female Codebreaker | 2023
Maximum GCD among all subarrays of size >= 2 - Stack Overflow

#include<bits/stdc++.h>

using namespace std;

int main(){
int n;
cin >> n;
vector<int> arr(n);

for(int i = 0; i < n; i++) cin >> arr[i];


vector<int> gcds(n);

for(int i = 0; i < n - 1; i++)


gcds[i] = __gcd(arr[i], arr[i + 1]);

gcds[n - 1] = INT_MIN;

int maxgcd = 1;
for(int i = 0; i < n; i++) maxgcd = max(maxgcd, gcds[i]);

int l = 0, r = 0, ans = 2;

while(r < n){


if(gcds[r] != maxgcd){
ans = max(ans, r - l + 1);
l = r + 1;
}
r++;
}

cout << ans << endl;


return 0;
}

2 Subsequence Sort
https://www.thejoboverflow.com/p/p1879/
Possible solution:->
#include <bits/stdc++.h>
using namespace std;
vector<int>fun(vector<string>&arr,string cur){
int cur_zero = 0, cur_one = 0, cur_score = 0, n= arr.size();
for(int i =cur.length();i>=0;i--){
if(cur[i]=='0')cur_zero++;
if(cur[i]=='1'){
cur_score+=cur_zero;
cur_one++;
}
}
vector<int>ans(n,0);
for(int i = 0;i<n;i++){
int j = arr[i].length()-1;
int zero_count = 0;
int one_count = 0;
for(int j = arr[i].length()-1;j>=0;j--){
if(arr[i][j]=='0')zero_count++;
else if(arr[i][j]=='1') one_count++;
}
zero_count = cur_zero-zero_count;
one_count = cur_one-one_count;
if(zero_count<0||one_count<0)break;
for(int j =0;j<arr[i].length();j++){
if(arr[i][j]!='?')continue;
if(zero_count>0){arr[i][j]='0';zero_count--;}
else {arr[i][j]='1';one_count--;}
}
int score = 0;
for(int j = arr[i].length()-1;j>=0;j--){
if(arr[i][j]=='0')zero_count++;
else score+=zero_count;
}
if(cur_score >= score)ans[i]=1;
}
return ans;
}
int main()
{
int n = 2;
vector<string>arr = {"?110?1","111???"};
string start = "110100";
auto ans = fun(arr,start);
for(auto it:ans){if(it==1)cout<<"YES"<<" ";else cout<<"NO";}
return 0;
}
=
Please review for example string - {0,1} =binary
​ ​ ​ ​ {?,0} = target
#include<bits/stdc++.h>

using namespace std;

int main(){
int n;
int slen;
string binary;

cin >> n >> slen;


cin >> binary;

vector<string> arr(n);
for(int i = 0; i < n; i++) cin >> arr[i];

vector<string> ans(n, "Yes");

for(int i = 0; i < n; i++){


queue<int> q;

for(int j = 0; j < slen; j++){


if(arr[i][j] == '1' && binary[j] == '0')
q.push(j);
else if(arr[i][j] == '?' && binary[j] == '0')
q.push(j);
}

for(int j = 0; j < slen; j++){


if(arr[i][j] == '0' && binary[j] == '1'){
if(q.empty()){
ans[i] = "No";
break;
}
q.pop();
}
if(q.front() == j) q.pop();
}

q = queue<int>();
for(int j = slen - 1; j >= 0; j--){
if(arr[i][j] == '0' && binary[j] == '1')
q.push(j);
else if(arr[i][j] == '?' && binary[j] == '1')
q.push(j);
}

for(int j = slen - 1; j >= 0; j--){


if(arr[i][j] == '1' && binary[j] == '0'){
if(q.empty()){
ans[i] = "No";
break;
}
q.pop();
}
if(q.front() == j) q.pop();
}

for(string s: ans) cout << s << " ";


cout << endl;

3 Untitled Question 2
https://www.thejoboverflow.com/p/p1300/
#include<bits/stdc++.h>

using namespace std;

int main(){
int n = 5;
vector<int> arr = {1, 3, 5, 2, 10};

// any difference can be reduced by half,


// diff ^ 2 is replaced by (diff / 2)^2 + (diff / 2)^2 = (diff^2) / 2 by
introducing a mid element.
//

int maxdiff = INT_MIN, left, right, total = 0;


for(int i = 1; i < n; i++){
if(maxdiff < abs(arr[i] - arr[i -1])){
maxdiff = abs(arr[i] - arr[i - 1]);
left = arr[i - 1];
right = arr[i];
}

total += (arr[i] - arr[i - 1]) * (arr[i] - arr[i - 1]);


}

int mid = (left + right) / 2, ans;

ans = total - (right - left) * (right - left) + (mid - left) * (mid - left)
+ (right - mid) * (right - mid);

cout << ans << endl;


return 0;
}

4 Untitled Question 3
https://www.thejoboverflow.com/p/p1300/

#include<bits/stdc++.h>

using namespace std;

int main(){
int n, x, m, q;
cin >> n >> x >> m >> q;

vector<pair<int, int >> logs(m);


vector<pair<int, int>> queries(q);

for(int i = 0; i < m; i++){


int server, t;
cin >> server >> t;
logs[i] = {t, server};
}

for(int i = 0; i < q; i++){


int query;
cin >> query;
queries[i] = {query, i};
}

sort(logs.begin(), logs.end());
sort(queries.begin(), queries.end());

unordered_map<int, int> map;

int l = 0, r = 0;
vector<int> ans(q);

for(int i = 0; i < q; i++){


int cur = queries[i].first;
while(r < m && logs[r].first <= cur){
map[logs[r].second]++;
r++;
}

while(l < r && logs[l].first < cur - x){


map[logs[l].second]--;
if(map[logs[l].second] == 0)
map.erase(logs[l].second);
l++;
}

ans[queries[i].second] = n - map.size();
}

for(int it: ans) cout << it << " ";


cout << endl;

5 Dominating XOR
https://www.thejoboverflow.com/p/p1300/
#include<bits/stdc++.h>

using namespace std;

//
// a XOR b > a AND b if a and b have their first set bit from MSB at different
position
// 00010101011111
// 00000101010111
// XOR 00010000001000
// AND 00000101010111

// if they have their first set bit at same position, XOR will have 0, and AND
will have 1
// at that position => AND > XOR

int main(){
int n = 4;
vector<int> arr = {1, 1, 5, 7};

vector<int> firstbit(n);
int ans = 0;

for(int i = 0; i < n; i++){


for(int j = 31; j>= 0; j--){
if(arr[i] & (1 << j)){
firstbit[i] = j;
break;
}
}
}

unordered_map<int, int> map;

for(int i = 0; i < n; i++){


ans += i - map[firstbit[i]];
map[firstbit[i]]++;
}

cout << ans << endl;


return 0;
}

6 Untitled Question 5, Min swap to sort

https://www.thejoboverflow.com/p/p1300/
https://practice.geeksforgeeks.org/problems/minimum-swaps/1
https://www.geeksforgeeks.org/minimum-number-swaps-required-sort-array/

int minSwaps(vector<int>&nums)
{
int n = nums.size();
vector<pair<int, int>> ds(n);
for(int i = 0; i < n; i++) ds[i] = {nums[i], i};

sort(ds.begin(), ds.end());

vector<int> graph(n);
vector<bool> visited(n);
int ans = 0;

for(int i = 0; i < n ; i++)


graph[ds[i].second] = i;

for(int i = 0; i < n; i++){


if(visited[i]) continue;
visited[i] = true;
int cur = i;
while(graph[cur] != i) {
ans++;
cur = graph[cur];
visited[cur] = true;

}
}

return ans;
}
7 Rest API
https://www.thejoboverflow.com/p/p1413/

import requests

ans = {}
def processData():
print("Processing data...")
url = "https://jsonmock.hackerrank.com/api/universities"

page = 1

while True:
res = requests.get(url=url, params = {"page": page})
data = res.json()
data = data["data"]

if len(data) == 0:
break

for record in data:


curcountry = record["location"]["country"]
curname = record["university"]
currank = int(record["rank_display"])

if curcountry in ans.keys():
if ans[curcountry]["rank"] > currank:
ans[curcountry] = {"name": curname, "rank": currank}
else:
ans[curcountry] = {"name" : curname, "rank": currank}

page += 1
print("Done")

def bestUniversityByCountry(country):
if country in ans.keys():
return ans[country]["name"]

return ""
def main():
processData()

country = "United States"

print(bestUniversityByCountry(country))

if __name__ == "__main__":
main()

Samsung

1.Unique subsequence

#include <iostream>​
#include <vector>​
#include <map>​

using namespace std;​

const int MOD = 1000000007;​

int countDistinctSubsequences(string s) {​
int n = s.length();​
vector<int> dp(n + 1, 0);​
map<char, int> lastOccurrence;​

dp[0] = 1; // Empty subsequence is counted​
for (int i = 1; i <= n; i++) {​
dp[i] = (2 * dp[i - 1]) % MOD;//twice piche wala add karenge​
//check kro ke last pehle occur hua h kya​

if (lastOccurrence.find(s[i - 1]) != lastOccurrence.end()) {​
//kaha hua h use value minus krdo dp ki​
// s[i-1] wo character dega and lastOccurrence[ch] wo index jo
dp ko chiye​
dp[i] -= dp[lastOccurrence[s[i - 1]]];​
}​
dp[i] = (dp[i] + MOD) % MOD;​
lastOccurrence[s[i - 1]] = (i - 1);//last character jo aya usko add
krdo​
}​

return (dp[n] - 1 + MOD) % MOD; // Subtract 1 to exclude the empty
subsequence​
}​

int main() {​
string s = "aabc";​
int result = countDistinctSubsequences(s);​
cout << "Number of distinct subsequences: " << result << endl;​
return 0;​
}​

2 Word wrap

Last line cost was included in the actual question, but on gfg last line cost is not included.
Remove the postsum thing and the code should work for company

https://practice.geeksforgeeks.org/problems/word-wrap1646/

int helper(int start, vector<int>& nums, vector<int>& dp, vector<int>& postsum,


int k){
int cur = 0, n = nums.size(), ans = INT_MAX;

if(start >= n) return 0;

if(dp[start] != -1) return dp[start];


// for checking if the remaining word can come in one last line
if(postsum[start] <= k) return 0;

for(int i = start; i < n; i++){


cur += nums[i];
if(i != start)
cur++; // counting space
if(cur > k)
break;
int temp = helper(i + 1, nums, dp, postsum, k);
ans = min(ans, (k - cur) * (k - cur) + temp);
}
dp[start] = ans;
return dp[start];
}

int solveWordWrap(vector<int>nums, int k)


{
int n = nums.size();
vector<int> dp(n, -1);
vector<int> postsum(n, 0);

postsum[n - 1] = nums[n - 1];


for(int i = n - 2; i >= 0; i--){
postsum[i] = nums[i] + postsum[i + 1] + 1;

// if a word len > line limit


if(nums[i] > k) return -1;
}

int ans = helper(0, nums, dp, postsum, k);

return ans;
}

3 Longest Consecutive path


Similar https://practice.geeksforgeeks.org/problems/longest-increasing-path-in-a-matrix

#include<bits/stdc++.h>

using namespace std;


int ans = 1;

int dfs(int x, int y, vector<vector<char>>& matrix, vector<vector<int>>& cost){


if(cost[x][y] != -1) return cost[x][y];

int n = matrix.size(), m = matrix[0].size(), curans = 0;

vector<int> pp = {0, 1, 1, 1, 0, -1, -1, -1}, qq = {1, 1, 0, -1, -1, -1, 0,


1};

for(int k = 0; k < 8; k++){


int r = x + pp[k], c = y + qq[k];

if(r < n && r >= 0 && c < m && c >= 0 && matrix[x][y] + 1 ==
matrix[r][c]){
int temp = dfs(r, c, matrix, cost);
curans = max(curans, temp);
}
}

cost[x][y] = 1 + curans;
ans = max(ans, cost[x][y]);

return cost[x][y];
}

int main() {
int n, m;
cin >> n >> m;
char ch;
cin >> ch;

vector<vector<char>> matrix(n, vector<char>(m));

for(int i = 0; i < n; i++){


for(int j = 0; j < m; j++)
cin >> matrix[i][j];
}

vector<vector<int>> cost(n, vector<int>(m, -1));


for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(matrix[i][j] != ch) continue;
dfs(i, j, matrix, cost);
}
}
cout << ans << endl;
return 0;
}

4 Maximum Index difference

#include<bits/stdc++.h>

using namespace std;

int main() {
int n;
cin >> n;

vector<pair<int, int>> ds(n);

for(int i = 0; i < n; i++){


int temp;
cin >> temp;
ds[i] = {temp, i};
}

sort(ds.begin(), ds.end());
int ans = 0, maxsofar = ds[n - 1].second;

for(int i = n - 2; i >= 0; i--){


int cur = ds[i].second;
if(cur < maxsofar)
ans = max(ans, maxsofar - cur);

maxsofar = max(maxsofar, cur);


}
cout << ans << endl;
return 0;
}

Stripe
1 Payout

1.1 Part one only


#include<bits/stdc++.h>
using namespace std;

#define CHFtoUSD(amt) 0.97 * amt


#define EURtoUSD(amt) 1.05 * amt
#define GBPtoUSD(amt) 1.24 * amt

#define USDtoCHF(amt) (amt / 0.97)


#define USDtoEUR(amt) (amt / 1.05)
#define USDtoGBP(amt) (amt / 1.24)

struct record{
int dd, mm, yy;
int amount;
string currency;
};

double convert (string from, string to, double amt){


if(from == "CHF") amt = CHFtoUSD(amt);
else if(from == "EUR") amt = EURtoUSD(amt);
else if(from == "GBP") amt = GBPtoUSD(amt);

if(to == "CHF") amt = USDtoCHF(amt);


else if (to == "EUR") amt = USDtoEUR(amt);
else if (to == "GBP") amt = USDtoGBP(amt);

return amt;
}

void process_payout(string part, int c, struct record charges[], set<string>&


acc, string defaultcur){

unordered_map<string, double> map;


for(int i = 0; i < c; i++){

if(acc.find(charges[i].currency) == acc.end()){
charges[i].amount = convert(charges[i].currency, defaultcur,
charges[i].amount);
charges[i].currency = defaultcur;

}
map[charges[i].currency] += charges[i].amount;
}

// fee
for(auto keyval: map){
map[keyval.first] = keyval.second * 0.98;
}

for(auto keyval: map){


int t;
if(keyval.second - (int)keyval.second >= 0.5)
t = (int)keyval.second + 1;
else
t = (int)keyval.second;
cout << keyval.first << ", " << t << endl;
}
}
int main ()
{
int n, c;
string part;
cin >> n >> c;
cin >> part;
set <string> acc;
string defaultcur;
struct record charges[c];

for (int i = 0; i < n; i++){


string temp;
cin >> temp;

if(i == 0) defaultcur = temp;


acc.insert(temp);
}

for (int i = 0; i < c; i++)


{
string temp;
char dump;
cin >> temp;

stringstream ss (temp);

ss >> charges[i].yy >> dump >> charges[i].mm >> dump >> charges[i].dd >>
dump;
ss >> charges[i].amount >> dump;
ss >> charges[i].currency;
}

process_payout(part, c, charges, acc, defaultcur);


}

1.2 Part 2

#include<bits/stdc++.h>
using namespace std;

#define CHFtoUSD(amt) 0.97 * amt


#define EURtoUSD(amt) 1.05 * amt
#define GBPtoUSD(amt) 1.24 * amt

#define USDtoCHF(amt) (amt / 0.97)


#define USDtoEUR(amt) (amt / 1.05)
#define USDtoGBP(amt) (amt / 1.24)

struct record{
int dd, mm, yy;
double amount;
string currency;
};

double convert (string from, string to, double amt){


if(from == "CHF") amt = CHFtoUSD(amt);
else if(from == "EUR") amt = EURtoUSD(amt);
else if(from == "GBP") amt = GBPtoUSD(amt);

if(to == "CHF") amt = USDtoCHF(amt);


else if (to == "EUR") amt = USDtoEUR(amt);
else if (to == "GBP") amt = USDtoGBP(amt);

return amt;
}

int maxdaysofmonth(int y, int m){


bool leap = false;
if(y % 400 == 0) leap = true;
else if(y % 4 == 0 & y % 100 != 100) leap = true;

if(m == 2 && leap) return 28;


else if( m == 2 && leap) return 29;

if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
return 31;
return 30;
}

string getDateStr(int y, int m, int d, int toadd){


int mday = maxdaysofmonth(y, d);
d += toadd;
if(d > mday){
d = mday - d;
if(m == 12){
m = 1;
y += 1;
}
else
m++;
}
char temp[100];
sprintf(temp, "%04d-%02d-%02d", y, m, d);

return string(temp);
}

void printPartOne(unordered_map<string, double>& map, string cur,


vector<string>& output){
double amt = 0;
char tempstr[100];
for(auto kv: map) amt += kv.second;

if (amt == 0) return;

if(amt - (int)amt > 0.5) amt = (int) amt + 1;


else amt = (int) amt;

sprintf(tempstr, "%s,%d", cur.c_str(), (int)amt);


output.push_back(string(tempstr));
}

void printPartTwo(unordered_map<string, double>& map, string cur,


vector<string>& output){
double amt = 0;
string date;
char tempstr[100];
for(auto kv: map) {
amt = kv.second;
date = kv.first;
if(amt - (int)amt > 0.5) amt = (int) amt + 1;
else amt = (int) amt;
sprintf(tempstr, "%s,%s,%d", date.c_str() ,cur.c_str(), (int)amt);
output.push_back(string(tempstr));
}
}

void process_payout(string part, int c, struct record charges[], set<string>&


acc, string defaultcur){

unordered_map<string, double> usd;


unordered_map<string, double> chf;
unordered_map<string, double> eur;
unordered_map<string, double> gbp;

for(int i = 0; i < c; i++){


int dd, mm, yy;
double amt = charges[i].amount;
string cur = charges[i].currency;
dd = charges[i].dd;
mm = charges[i].mm;
yy = charges[i].yy;

if(acc.find(cur) == acc.end()){
amt = convert(cur, defaultcur, amt);
cur = defaultcur;
}

string processed_date;
if(cur == "USD"){
processed_date = getDateStr(yy, mm, dd, 0);
usd[processed_date] += amt * 0.98;
}
else if(cur == "CHF"){
processed_date = getDateStr(yy, mm, dd, 3);
chf[processed_date] += amt * 0.98;
}
else if(cur == "EUR"){
processed_date = getDateStr(yy, mm, dd, 2);
eur[processed_date] += amt * 0.98;
}
else if(cur == "GBP"){
processed_date = getDateStr(yy, mm, dd, 1);
gbp[processed_date] += amt * 0.98;
}
}

vector<string> output;
if(part == "one"){
printPartOne(usd, "USD", output);
printPartOne(chf, "CHF", output);
printPartOne(eur, "EUR", output);
printPartOne(gbp, "GBP", output);
}
else{
printPartTwo(usd, "USD", output);
printPartTwo(chf, "CHF", output);
printPartTwo(eur, "EUR", output);
printPartTwo(gbp, "GBP", output);
}

sort(output.begin(), output.end());

for(string t: output) cout << t << endl;


}
int main ()
{
int n, c;
string part;
cin >> n >> c;

cin >> part;


set <string> acc;
string defaultcur;
struct record charges[c];

for (int i = 0; i < n; i++){


string temp;
cin >> temp;

if(i == 0) defaultcur = temp;


acc.insert(temp);
}
for (int i = 0; i < c; i++)
{
string temp;
char dump;
cin >> temp;

stringstream ss (temp);

ss >> charges[i].yy >> dump >> charges[i].mm >> dump >> charges[i].dd >>
dump;
ss >> charges[i].amount >> dump;
ss >> charges[i].currency;
}

process_payout(part, c, charges, acc, defaultcur);


}

Meesho
1 Interesting pairs
https://www.thejoboverflow.com/p/p1508/

#include<bits/stdc++.h>
using namespace std;

// sorting array will ensure arr[i] <= arr[j] hence (arr[i] - arr[j]) <= 0
// solving the exp => 2 * arr[j] = samval
int main(){
int n, samval;
cin >> n;
vector<int> arr(n);

for(int i = 0; i < n; i++) cin >> arr[i];


cin >> samval;
if(samval % 2 != 0){
cout << 0 << endl;
return 0;
}

sort(arr.begin(), arr.end());

int lb = lower_bound(arr.begin(), arr.end(), samval/2) - arr.begin();


int ub = upper_bound(arr.begin(), arr.end(), samval/2) - arr.begin() - 1;

int ans = 0;

for(int i = lb; i <= ub; i++)


ans += i;

cout << ans << endl;


return 0;
}

2 Visible profile

https://www.thejoboverflow.com/p/p1508/

#include<bits/stdc++.h>
using namespace std;

class DisjointSet{
vector<int> parent, setsize;
public:

DisjointSet(int n){
parent.resize(n);
setsize.resize(n, 1);

for(int i = 0; i < n; i++) parent[i] = i;


}

int findUparent(int u){


if(parent[u] == u) return u;
return parent[u] = findUparent(parent[u]);
}

void unionbysize(int u, int v){


int up = findUparent(u);
int vp = findUparent(v);

if(up == vp) return;


if(setsize[up] >= setsize[vp]){
parent[vp] = up;
setsize[up] += setsize[vp];
}
else{
parent[up] = vp;
setsize[vp] += setsize[up];
}
}

int getSize(int u){


int up = findUparent(u);
return setsize[up];
}
};

int main(){
int n, m, q;
cin >> n >> m >> q;
int from[n], to[n], queries[n];

for(int i = 0; i < m; i++) cin >> from[i];


for(int i = 0; i < m; i++) cin >> to[i];

for(int i = 0; i < q; i++) cin >> queries[i];

DisjointSet ds(n + 1);

for(int i = 0; i < m; i++){


ds.unionbysize(from[i], to[i]);
}
for(int i = 0; i < q; i++)
cout << ds.getSize(queries[i]) << " ";
cout << endl;
}

3 Meesho OA question 1

https://drive.google.com/drive/u/5/folders/1-vtRHN3R1ZOYg38ae21Y84frS-Ev1ERT
#include<bits/stdc++.h>

using namespace std;

int main(){
int n;
cin >> n;
vector<int> prices(n);

for(int i = 0; i < n; i++) cin >> prices[i];


int minp, maxp;
cin >> minp >> maxp;

int invalid = -1, lastmin = -1, lastmax = -1;


int ans = 0;

for(int i = 0; i < n; i++){


if(prices[i] < minp || prices[i] > maxp){
invalid = i;
lastmin = lastmax = -1;
continue;
}
if(prices[i] == minp) lastmin = i;
if(prices[i] == maxp) lastmax = i;

if(lastmin != -1 && lastmax != -1){


ans += min(lastmin, lastmax) - invalid;
}
}

cout << ans << endl;


}

4 Meesho Question 2
#include<bits/stdc++.h>
using namespace std;

int solve(int n, vector<int>& arr){


unordered_map<int, int> freq;
for(int i = 0; i < n; i++) freq[arr[i]]++;

priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int,


int>>> pq;
int ans = 0 ;
for(auto kv : freq){
if(kv.second > 1){
pq.push({kv.first, kv.second - 1});

ans += kv.second - 1;
}
}
int i = 0;
while(i < n && !pq.empty()){
int curval = pq.top().first, f = pq.top().second;
pq.pop();

while(i < n && f){


if(arr[i] == curval) f--;
i++;
}

if(f) return -1;


}
if(!pq.empty()) return -1;
return ans;
}
int main(){
int n;
cin >> n;
vector<int> arr(n);

for(int i = 0; i < n; i++) cin >> arr[i];

cout << solve(n, arr) << endl;


}

Solution 2
vector<int>fun(vector<int>&arr){
unordered_map<int,int>mp; vector<int>ans;
for(int i=0;i<arr.size();i++){
if(mp.count(arr[i])){
if(ans.size()==0||ans.back()<=arr[i]){
ans.push_back(arr[i]);
}
else{
return {-1};
}
}
mp[arr[i]]++;
}
return ans;
}

5 Meesho Q3
https://www.codechef.com/problems/PRESUFOP

Solution 1
Not sure :wrong testcase{5,3,6,3,5}
import java.util.*;
import java.io.*;
public class Main
{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] source = new int[n];
int[] target = new int[n];
for(int i=0;i<n;i++) source[i] = sc.nextInt();
for(int i=0;i<n;i++) target[i] = sc.nextInt();
System.out.println(count(n, source, target));
}
public static int count(int n, int[] source, int[] target){
int[] req = new int[n];
for(int i=0;i<n;i++){
req[i] = target[i] - source[i];
if(req[i] < 0) return -1;
}
int descend_left = 1;
int descend_right = 1;
for(int i=1;i<n;i++){
if(req[i] <= req[i-1]) descend_left++;
else break;
}
for(int i=n-2;i>=0;i--){
if(req[i] <= req[i+1]) descend_right++;
else break;
}
if(descend_left + descend_right < n) return -1;
if(descend_left == n) return req[0];
if(descend_right == n) return req[n-1];
return req[0]+req[n-1];
}
}
Solution 3
Bhai aftab wrong solution aa rha is ka bhi
Not sure
#include<bits/stdc++.h>

using namespace std;

int solve(int n, vector<int>& source, vector<int>& target){


int left, right, ans;
vector<int> arr(n);
for(int i = 0; i < n; i++) arr[i] = target[i] - source[i];

left = ans = arr[0];


right = 0;
for(int i = 1; i < n; i++){
int cur = arr[i];
if(cur < right) return -1;
cur = max(0, cur - right);
​ //change swap 2 lines
left = min(left, cur);
cur = max(0, cur - left);

ans += cur;
right += cur;
}

return ans;
}

int main(){
int n;
cin >> n;

vector<int> source(n), target(n);

for(int i = 0; i < n; i++) cin >> source[i];


for(int i = 0; i < n; i++) cin >> target[i];

cout << solve(n, source, target) << endl;

}
//code chef sa tapa ha
# cook your dish here def presufop():
for t in range(int(input())):
n = int(input()) a = list(map(int, input().split()))
b = list(map(int, input().split()))
op1 , op2 = b[0]-a[0], 0
res1, res2 = 0, 0
for i in range(n):
if (op1 + op2 < b[i] - a[i]):
​ op2 += ((b[i]-a[i]) - op1 - op2)
elif (op1 + op2 > b[i] - a[i]):
op1 -= (op1 + op2 - (b[i] - a[i]))
if (op1 < 0 or op2 > (b[n-1] - a[n-1])):
​ res1 = -1 res2 = 0
​ break
res1 = max(res1, op1)
res2 = max(res2, op2)
print(res1 + res2)
if __name__ == "__main__":
presufop()

6 Flipkart
1 . Online Video streaming platform
https://www.thejoboverflow.com/p/p1638/

Print an integer representing the minimum number of iterations of swapping required so that at
least K videos of identical length get the contiguous position. If the required arrangement is not
possible then print -1.\

Sol 1

#include <bits/stdc++.h>
using namespace std;
int fun(vector<int>&arr,int k){
unordered_map<int,pair<int,int>>mp;
unordered_map<int,queue<int>>pos;
if(k==1)return 0;
int ans = INT_MAX;
int n = arr.size();
for(int i=0;i<n;i++){
if(mp.count(arr[i])){
auto prev = mp[arr[i]];
int cur_cost = i-prev.first-1+prev.second;
pos[arr[i]].push(i);
if(pos[arr[i]].size()>k){
int ind = pos[arr[i]].front();
pos[arr[i]].pop();
int reduce_cost = pos[arr[i]].front()-ind-1;
cur_cost-=k*reduce_cost;
}
if(pos[arr[i]].size()==k){
ans = min(ans,cur_cost);
}
mp[arr[i]] = {i,cur_cost};
}
else{
mp[arr[i]] = {i,0};
pos[arr[i]].push(i);
}
}
unordered_map<int,pair<int,int>>mp1;
unordered_map<int,queue<int>>pos1;
for(int i=n-1;i>=0;i--){
if(mp1.count(arr[i])){
auto prev = mp1[arr[i]];
int cur_cost = prev.first -1 -i + prev.second;
pos1[arr[i]].push(i);
if(pos1[arr[i]].size()>k){
int ind = pos1[arr[i]].front();
pos1[arr[i]].pop();
int reduce_cost = ind-1-pos1[arr[i]].front();
cur_cost -= k*reduce_cost;
}
if(pos1[arr[i]].size()==k){
ans = min(ans,cur_cost);
}
mp1[arr[i]] = {i,cur_cost};
}
else{
mp1[arr[i]] = {i,0};
pos1[arr[i]].push(i);
}
}
return ans;
}
int main() {
int n;
cin>>n;
vector<int>arr(n);
for(int i =0;i<n;i++){
int temp;
cin>>temp;
arr[i]=temp;
}
int k;
cin>>k;
int ans = fun(arr,k);
cout<<ans<<" \n";
}

Sol 2

https://www.thejoboverflow.com/p/p1638/

Not tested. Please check.


Idea is to bring identical elements around the mid element of sequence
N = 11
Arr = 1 2 2 3 4 2 1 5 3 2 1
K=4
Eg 2:
N = 10
Arr = 1 2 2 3 2 1 5 3 2 1
k=4

Only 2 is >= 4
Bring all 2 around the 2 at index 2
#include<bits/stdc++.h>
using namespace std;

int solve(vector<pair<int, int>>& ds, int x, int y, int k){


int l = x, r = l + k - 1;

// first window
int mid = (l + r) / 2, cur = 0, ans = INT_MAX;
int median = ds[mid].second;

int t1 = l;
while(t1 <= r){
int targetpos = median - (mid - t1);
cur += abs(targetpos - ds[t1].second);
t1++;
}

ans = min(ans, cur);


r++;
// rest window
while(r <= y){
int targetpos = median - (mid - l);
cur -= abs(targetpos - ds[l].second);

mid++;
median = ds[mid].second;

targetpos = median - (mid - r);


cur += abs(targetpos - ds[r].second);

ans = min(ans, cur);


l++;
r++;

return ans;
}

int main(){
int n, k;
cin >> n;
vector<int> arr(n, 0);
for(int i = 0; i < n ; i++) cin >> arr[i];
cin >> k;
vector<pair<int, int>> ds(n);

for(int i = 0; i < n; i++){


ds[i] = {arr[i], i};
}

sort(ds.begin(), ds.end());
ds.push_back({INT_MAX, -1});
int l = 0, r = 1, ans = INT_MAX;
while(r < n + 1){
if(ds[l].first != ds[r].first){
int temp;
if(r - l >= k){
temp = solve(ds, l, r - 1, k);
ans = min(ans, temp);
}
l = r;
}

r++;
}
cout << ans << endl;
return 0;
}

2 Warehouse robot
https://drive.google.com/drive/u/5/folders/1pZGjZxlYyB-x3LR-_xGjfJ8vUdjZxdBK
Smallest range in K lists | Practice | GeeksforGeeks

https://www.youtube.com/watch?v=mYDF7xsYmI4

pair<int,int> findSmallestRange(int arr[][N], int n, int k)


{

priority_queue<pair<int, int>, vector<pair<int, int>>,


greater<pair<int, int>>> pq;
vector<int> is(k, 1);
int maxx = INT_MIN;
for(int i = 0; i < k; i++) {
pq.push({arr[i][0], i});
maxx = max(maxx, arr[i][0]);
}

pair<int, int> ans = {0, 1e6};

while(!pq.empty()){
int val = pq.top().first;
int row = pq.top().second;
pq.pop();

if(maxx - val < ans.second - ans.first)


ans = {val, maxx};

if(is[row] >= n) break;


pq.push({arr[row][is[row]], row});
maxx = max(maxx, arr[row][is[row]]);
is[row]++;

}
return ans;
}

Air India

1 Racer Selection

https://drive.google.com/drive/u/5/folders/10ssHI8WVn1CaaF7YfxZ5aCOw4GUhqFcS
int solve2(vector<int>& arr, int n, int k){
int start = 0, end = 0, ans = INT_MIN;
unordered_map<int, int> map;
multiset<int> ms;

while(end < n){

if(map.find(arr[end]) != map.end() && ms.find(map[arr[end]]) !=


ms.end())
ms.erase(ms.find(map[arr[end]]));
map[arr[end]]++;
ms.insert(map[arr[end]]);

int mode = *ms.rbegin();


ans = max(ans, mode);

int re = end - start + 1 - mode;


if(re == k + 1){
ms.erase(ms.find(map[arr[start]]));
map[arr[start]]--;
if(map[arr[start]] != 0)
ms.insert(map[arr[start]]);
start++;
}
end++;
}

return ans;
}
int main(){
int n, k;
cin >> n >> k;

vector<int> arr(n);
for(int i = 0; i < n; i++) cin >> arr[i];

cout << solve2(arr, n, k) << endl;


}
BNY mellon
1 Bit Profit
https://drive.google.com/drive/u/5/folders/1OzxjrKKEqRFWM0-kMOCQuPN9lAANLYr0

Paste the correct one here.

Google

1 Special Subsequence

https://drive.google.com/drive/u/5/folders/11PO_wCeJWiuRG7PV85qVzfwCvqIXo5XN

#include<bits/stdc++.h>
using namespace std;
int mod = 1e9 + 7;

int nCr(int n, int r){


long long ne = 1, de = 1;

if(r > n - r)
r = n - r;

for(int i = 0; i < r; i++){


ne *= (n - i);
de *= (i + 1);

int gcd = __gcd(ne, de);


ne /= gcd;
de /= gcd;
}

return (ne/de) % mod;


}

long long power(long long a, long long b){


if(b == 1)
return a;
int t = power(a, b / 2);

if(b % 2 == 1)
return (a * t * t) % mod;
return (t * t) % mod;
}

int solve(int n, int k, string s){


vector<int> freq(26, 0);

for(char c : s){
freq[c - 'a']++;
}

sort(freq.begin(), freq.end(), greater<int>());


int need = k, l = 0, r = 1, ans = 1;
while(r < 26){
if(freq[r] != freq[r - 1]){
if(r - l > need){
int temp = nCr(r - l, need);
ans = (ans * temp) % mod;
ans = (ans * freq[l]) % mod;
break;
}
else{
need -= r - l;
ans = (ans * power(freq[l], r- l)) % mod;
}
l = r;
}
r++;
}

return ans;
}

int main(){
int n, k;
cin >> n >> k;

string s;
cin >> s;
cout << solve(n, k, s) << endl;
}

2 More ones
https://practice.geeksforgeeks.org/problems/count-the-substring--170645/1

https://www.youtube.com/watch?v=LO1qGTE-Xbo

3 Minimum cost path

https://drive.google.com/drive/u/5/folders/11PO_wCeJWiuRG7PV85qVzfwCvqIXo5XN

#include<bits/stdc++.h>
using namespace std;
int mod = 1e9 + 7;

int solve(vector<vector<int>>& input, int r, int c){


vector<vector<int>> arr(c, vector<int>(r));
vector<int> index(c, 1);
int maxx = INT_MIN, ans = INT_MAX;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int,
int>>> pq;

for(int i = 0; i < r; i++)


for(int j = 0; j < c; j++)
arr[j][i] = input[i][j];

for(int i = 0; i < c; i++)


sort(arr[i].begin(), arr[i].end());

for(int i = 0; i < c; i++){


pq.push({arr[i][0], i});
maxx = max(arr[i][0], maxx);
}

while(!pq.empty()){
int val = pq.top().first;
int row = pq.top().second;
pq.pop();

ans = min(ans, maxx - val);


if(index[row] >= c) break;

pq.push({arr[row][index[row]], row});
maxx = max(maxx, arr[row][index[row]]);
index[row]++;
}

return ans;
}

int main(){

int r, c;
cin >> r >> c;

vector<vector<int>> arr(r, vector<int>(c));

for(int i = 0; i < r; i++)


for(int j = 0; j < c; j++)
cin >> arr[i][j];

cout << solve(arr, r,c) << endl;


}

Capital one
1 Matchmaker
https://drive.google.com/drive/u/5/folders/1R8bfO915uXqA7AQCLigqJFy56EXKDSrw

Constraint N < 10^3. N^2 will work


#include<bits/stdc++.h>
using namespace std;

void solve(int n, int k, vector<int>& arr){


vector<int> ans(n, -1);

for(int i = 0; i < n; i++){


if(ans[i] != -1) continue;
for(int j = 0; j < i; j++){
if(ans[j] != -1) continue;
if(arr[j] <= arr[i] + k && arr[j] >= arr[i] - k){
ans[j] = i + 1;
ans[i] = j + 1;
break;
}
}
}

for(int it: ans) cout << it << " ";


cout << endl;
}

int main(){
int n, k;
cin >> n >> k;

vector<int> arr(n);

for(int i = 0; i < n; i++){


cin >> arr[i];
}

solve(n, k, arr);
}
2 JSON Parsing
https://drive.google.com/drive/u/5/folders/1R8bfO915uXqA7AQCLigqJFy56EXKDSrw

"Student":{"Name":{"FN":"John","LN":"Hussain"},"Age":"15"},"Class":"10"
3
Student.Name.LN Student.Age Class

#include<bits/stdc++.h>
using namespace std;

int mod = 1e9 + 7;

string getValue(string key, string json){


// Rabin Karp Algorithm
long long sourcecode = 0, targetcode = 0;
int n = json.length(), k = key.length();

long long power = 1;


for(int i = 0; i < k - 1; i++) power = (power * 26) % mod;

for(char c: key){
targetcode = (targetcode * 26 + c) % mod;
}
int l = 0, r = 0;
while(r < n){
sourcecode = (sourcecode * 26 + json[r]) % mod;

if(r - l + 1 < k) {
r++;
continue;
}

if(sourcecode == targetcode){
if(json.substr(l, k) == key){
if(json[r + 3] == '{'){
int t = r + 4, count = 1;
while(t < n && count != 0){
if(json[t] == '{') count++;
else if(json[t] == '}') count--;
t++;
}
return json.substr(r + 3, (t - 1)- (r + 3) + 1);
}
else if (json[r + 3] == '"'){
int t = r + 4;
while(t < n && json[t] != '"') t++;

return json.substr(r + 4, (t - 1) - (r + 4) + 1);


}
}
}

sourcecode = (sourcecode - (power * json[l]) % mod) % mod;

if(sourcecode < 0)
sourcecode += mod;

l++;
r++;
}

return "Not Found";


}

void solve(string& text, vector<string>& queries, int q){


vector<string> ans(q);

for(int i = 0; i < q; i++){


stringstream ss(queries[i]);
string temp, value = text;

//Tokenizing on '.'
while(getline(ss, temp, '.')){
value = getValue(temp, value);
}

ans[i] = value;
}

for(string s: ans) cout << s << " ";


cout << endl;
}

int main(){
string text;
cin >> text;

int q;
cin >> q;
vector<string> queries(q);

for(int i = 0; i < q; i++){


cin >> queries[i];
}

solve(text, queries, q);

3 Win the game

Shashi bhai ke sol se inspired.

#include<bits/stdc++.h>
using namespace std;

void build(vector<pair<int, int>>& seg, vector<int>& arr, int ind, int left,
int right){
if(left > right) return;

if(left == right){
seg[ind] = {arr[left - 1], 1};
return;
}

int mid = (left + right) / 2;


seg[ind] = {arr[mid - 1], mid - left + 1};

build(seg, arr, 2 * ind + 1, left, mid - 1);


build(seg, arr, 2 * ind + 2, mid + 1, right);
}

int update(vector<pair<int, int>>& seg, int ind, int offset, int k){
int toreturn;
if(offset + seg[ind].second == k && seg[ind].first != -1){
toreturn = seg[ind].first;
seg[ind].first = -1;
seg[ind].second--;
}
else if(offset + seg[ind].second >= k){
toreturn = update(seg, 2 * ind + 1, offset, k);
seg[ind].second--;
}
else
toreturn = update(seg, 2 * ind + 2, offset + seg[ind].second, k);

return toreturn;
}

int main(){
int n;
cin >> n;

vector<int> arr(n), pos(n);

for(int i = 0; i < n; i++) cin >> arr[i];


for(int i = 0; i < n; i++) cin >> pos[i];

vector<pair<int, int>> seg(4 * n + 10);

build(seg, arr, 0, 1, n);


for(int p : pos)
cout << update(seg, 0, 0, p) << " ";

cout << endl;

}
4 Hit counts

#include<bits/stdc++.h>
using namespace std;

int solve(int n, int k, int th, vector<int>& arr){


int l = 0, r = 0;
int cur = 0;

while(r < n){


cur += arr[r];

if(r - l + 1 > k){


cur -= arr[l];
l++;
}

if(cur > th) return 1;


r++;
}

return 0;
}

int main(){
int k, th, n;
cin >> k >> th >> n;
vector<int> arr(n);

for(int i = 0; i < n; i++) cin >> arr[i];

cout << solve(n, k, th, arr) << endl;

5 Query and Fruits


Solution : Queries to calculate sum of array elements present at every Yth index starting from
the index X - GeeksforGeeks

#include<bits/stdc++.h>

using namespace std;

int main(){
int mod = 1e9 + 7;
int n, q;
cin >> n >> q;

vector<int> arr(n + 1);


vector<vector<int>> queries(n + 1, vector<int>(3));

for(int i = 1; i < n + 1; i++) cin >> arr[i];


for(int i = 0; i < q; i++){
cin >> queries[i][0] >> queries[i][1] >> queries[i][2];
}

int rootn = sqrt(n);


vector<vector<int>> dpsum(n + 1, vector<int>(rootn + 1));
vector<vector<int>> dpmul(n + 1, vector<int>(rootn + 1));

for(int j = rootn; j >= 1; j--){


for(int i = n ; i >= 1; i--){
if(i + j < n + 1)
dpsum[i][j] = (dpsum[i + j][j] + arr[i]) % mod;
else
dpsum[i][j] = arr[i];
}
}

for(int j = rootn; j >= 1; j--){


for(int i = n ; i >= 1; i--){
if(i + j < n + 1)
dpmul[i][j] = (dpmul[i + j][j] * arr[i]) % mod;
else
dpmul[i][j] = arr[i];
}
}
for(int i = 0; i < q; i++){
if(queries[i][2] > rootn){
if(queries[i][0] == 0){
int ans = 0;
for(int k = queries[i][1]; k <= n; k += queries[i][2])
ans = (ans + arr[k]) % mod;

cout << ans << endl;


}
else{
int ans = 1;
for(int k = queries[i][1]; k <= n; k += queries[i][2])
ans = (ans * arr[k]) % mod;

cout << ans << endl;


}
}
else{
if(queries[i][0] == 0) cout << dpsum[queries[i][1]][queries[i][2]]
<< endl;
else cout << dpmul[queries[i][1]][queries[i][2]] << endl;
}
}

return 0;

5 A binary Palindrome
#include<bits/stdc++.h>
using namespace std;

int generatePal(int len, int offset){


int ans = 0;
ans = ans | (1 << (len - 1));
ans = ans | (offset << (len / 2));
int r = len - 1, l = 0;
while(l < r){
if(ans & (1 << r))
ans |= (1 << l);
l++; r--;
}

return ans;
}

int main(){
long long arr[100001];
arr[0] = 1; arr[1] = 3;
int k = 2;

for (int len = 3; len <= 31; len++){


int no_of_pal = pow(2, ceil((len - 2)/2.0));

for(int offset = 0; offset < no_of_pal; offset++){


arr[k++] = generatePal(len, offset);
}
}

int t;
cin >> t;

while(t--){
int n;
cin >> n;

int lb = lower_bound(arr, arr + k, n) - arr;


int ub = upper_bound(arr, arr + k, n) - arr;
if(arr[lb] != n) lb--;
cout << min(arr[ub] - n, n - arr[lb]) << endl;
}
}
Sol - 2 : using string :
#include <bits/stdc++.h>
using namespace std;
// function to convert to a palindrome number;
long long convert(string s){
int ans = 0;
if (s.size() == 0) return ans;
int len = s.size()-1;
for (char c : s){
if (c == '1') ans += 1<<len;
len--;
}
return ans;
}
void insert(vector<int> &pali,string s, bool even){
string rev = s;
reverse(rev.begin(),rev.end());
if (!even) rev.erase(rev.begin()) ;
s += rev;
int num = convert(s);
pali.push_back(num);
}
// function to get all the palindromes, input is string
void help(string s,bool zero,int idx,vector<int> &pali){
if (idx == 16){
insert(pali,s,true);
if (!s.empty()) insert(pali,s,false);
return;
}
if (zero){
help(s,true,idx+1,pali);
help(s+"1",false,idx+1,pali);
}
else {
help(s+"1",false,idx+1,pali);
help(s+"0",false,idx+1,pali);
}
}
int main() {
int n;
cin >> n;
vector<int> pali;
help("",true,0,pali);
sort(pali.begin(),pali.end());
while(n--){
int num;
cin >> num;
int idx = lower_bound(pali.begin(),pali.end(),num) - pali.begin();
int ans = pali[idx] - num;
if(idx-1>=0)ans = min(ans,num - pali[idx-1]);
cout << ans << endl;
}
}

AMD
1 Rotate Matrix 90 deg
https://practice.geeksforgeeks.org/problems/rotate-by-90-degree-1587115621/1
https://drive.google.com/file/d/1ejC_HoYavwVp5TIaGsQZm1DoqhJZ6vYl/view?usp=drive_link

void rotateby90(vector<vector<int> >& matrix, int n)


{
// transpose
for(int i = 0; i < n; i++){
for(int j = 0; j < i; j++){
swap(matrix[i][j], matrix[j][i]);
}
}

// swapping rows

int l = 0, r = n - 1;
while(l < r){
for(int i = 0; i < n; i++)
swap(matrix[l][i], matrix[r][i]);
l++; r--;
}

}
2 Count triplet with sum less than X

https://www.geeksforgeeks.org/count-triplets-with-sum-smaller-that-a-given-value/

long long countTriplets(long long arr[], int n, long long sum)


{
sort(arr, arr + n);
long long ans = 0;

// (i, j, k) triplets

for(int k = n - 1; k >= 2; k--){


int target = sum - arr[k];
int i = 0, j = k - 1;

while(i < j){


if(arr[i] + arr[j] >= target)
j--;
else{
// all the triplets (i, [i + 1 ...j], k) will be smaller
ans += j - i;
i++;
}
}
}

return ans;
}

You might also like