Google's Online Challenge - Coding - Intern Questions approach help

for Integer Distribution

Problem


#include<bits/stdc++.h>
using namespace std;
#define int long
#define pii pair<long,long>

int n;
const long MAX_VAL = 1e11, MIN_VAL = -1e11;
unordered_map<long,pii> dp;
vector<int> v;

pii recur(int idx,int mask){
	if(idx>=n){
		return mask==0 ? pair<int,int>{0,0} : pair<int,int>{MAX_VAL,MIN_VAL}; 
	}

	if(dp.count(mask*100+idx))
		return dp[mask*100+idx];

	pii res = pair<int,int>{MAX_VAL,MIN_VAL};
	res = recur(idx+1,mask|(1<<idx));

	for(int j=0;j<20;++j){
		if(mask&(1<<j)){
			int val = v[j] ^ v[idx];
			int newMask = mask & (~(1<<j));
			pii temp = recur(idx+1,newMask);
			res.first = min(res.first,val+temp.first);
			res.second = max(res.second,val+temp.second);
		}
	}

	return dp[mask*100+idx] = res;
}

void solve(){
	cin>>n;
	v.resize(n);
	for(int i=0;i<n;++i)
		cin>>v[i];

	pii res = recur(0,0);
	cout<<res.first<<" "<<res.second;
}

signed main(){
	solve();
	return 0;
}