Skip to content
Programming101
Programming101

Learn everything about programming

  • Home
  • CS Subjects
    • IoT – Internet of Things
    • Digital Communication
    • Human Values
  • Programming Tutorials
    • C Programming
    • Data structures and Algorithms
  • HackerRank Solutions
    • HackerRank Algorithms Solutions
    • HackerRank C problems solutions
    • HackerRank C++ problems solutions
    • HackerRank Java problems solutions
    • HackerRank Python problems solutions
Programming101
Programming101

Learn everything about programming

HackerEarth Min difference queries problem solution

YASH PAL, 31 July 2024
In this HackerEarth Min differene queries problem solution, You have a sequence a of length n and you want to answer q queries determined by 2 integers l and r. You take all numbers present in subsequence (al, al+1,…,ar, let them be b1,b2,…,bt and number of occurrences of each number in this subsequence be c1,c2,…,ct respectively. The answer for per query is equal to min|ci – cj| for 1 <= i < j <= t or 1 if t = 1.
HackerEarth Min difference queries problem solution

HackerEarth Min difference queries problem solution.

#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
#define ll long long
#define dbg(v) cerr<<#v<<" = "<<v<<'n'
#define vi vector<int>
#define vl vector <ll>
#define pii pair<int,int>
#define mp make_pair
#define db long double
#define pb push_back
#define all(s) s.begin(),s.end()
template < class T > T smin(T &a,T b) {if (a > b) a = b;return a;}
template < class T > T smax(T &a,T b) {if (a < b) a = b;return a;}
int t[1 << 23];
int L[1 << 23];
int R[1 << 23];
int Root[1 << 23];
int SZ = -1;
int get(int &k)
{
if (k == -1)
k = ++SZ,L[SZ] = R[SZ] = -1,t[SZ] = 0;
return k;
}
void build(int l,int r,int node)
{
if (l == r)
return ;
int m = (l + r) / 2;
build(l,m,get(L[node]));
build(m+1,r,get(R[node]));
}
void update(int l,int r,int pos,int v,int node,int prev)
{
if (l == r)
t[node] = v;
else
{
int m = (l + r) / 2;
if (pos <= m)
R[node] = R[prev];
else
L[node] = L[prev];
if (pos <= m)
update(l,m,pos,v,get(L[node]),L[prev]);
else
update(m+1,r,pos,v,get(R[node]),R[prev]);
t[node] = t[get(L[node])] + t[get(R[node])];
}
}
int query(int l,int r,int l1,int r1,int node)
{
if (l1 <= l && r <= r1)
return t[node];
int m = (l + r) / 2;
int ans = 0;
if (l1 <= m)
ans += query(l,m,l1,r1,L[node]);
if (m+1<=r1)
ans += query(m+1,r,l1,r1,R[node]);
return ans;
}
vi ss;
void go(int l,int r,int l1,int r1,int node)
{
if (!t[node])
return;
if (l == r)
return void(ss.pb(l));
int m = (l + r) / 2;
if (l1 <= m)
go(l,m,l1,r1,L[node]);
if (m+1<=r1)
go(m+1,r,l1,r1,R[node]);
}
const int N = (int)(1e6) + 5;
vi v[N];
int s[N];
int last[N];
int wh[N];
int n;
int get(int l,int r,int k)
{
return lower_bound(all(v[k]),r + 1) - lower_bound(all(v[k]),l);
}
int get(int l,int r)
{
vi w;
int d = query(1,n,l,r,Root[r]);
if (d > wh[r - l + 1])
return 0;
if (d == 1)
return -1;
ss.clear();
go(1,n,l,r,Root[r]);
for (auto &it : ss)
it = s[it];
for (auto it : ss)
w.pb(get(l,r,it));
sort(all(w));
int ans = 1e9;
for (int i = 0;i + 1 < d;++i)
smin(ans,w[i + 1] - w[i]);
return ans;
}
int main(void)
{
int q;
scanf("%d%d",&n,&q);
vi w;
wh[1] = 1;
for (int i = 2;i <= n;++i)
{
wh[i] = wh[i - 1];
if (1ll * wh[i] * (wh[i] + 1) / 2 <= i)
++wh[i];
}
for (int i = 1;i <= n;++i)
scanf("%d",&s[i]);
for (int i = 1;i <= n;++i)
w.pb(s[i]);
sort(all(w));
w.resize(unique(all(w)) - w.begin());
const int SZ = w.size();
for (int i = 1;i <= SZ;++i)
v[i].pb(0);
for (int i = 1;i <= n;++i)
v[s[i] = lower_bound(all(w),s[i]) - w.begin() + 1].pb(i);
for (int i = 1;i <= SZ;++i)
v[i].pb(n + 1);
Root[0] = -1;
build(1,n,get(Root[0]));
for (int i = 1;i <= n;++i)
{
int prev = Root[i - 1];
Root[i] = -1;
if (last[s[i]])
update(1,n,last[s[i]],0,get(Root[i]),prev),prev = Root[i],Root[i] = -1;
update(1,n,i,1,get(Root[i]),prev);
last[s[i]] = i;
}
int ans = 0;
while (q --)
{
int a,b;
scanf("%d%d",&a,&b);

int l = (a + ans) % n + 1;
int r = (b + ans) % n + 1;
ans = get(l,r);
printf("%dn",ans);
}
return 0;
}

Second solution

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

#define MAX 100002

int n;
int q;

vector<int> v;

#define MAGIC 333
#define MM 500
int u[MAGIC][MM];

int sz[MAGIC];


bool ex[MAX];

vector<int> vv;

vector<int> idx[MAX];

set<int> s;


int main() {
cin >> n >> q;
assert(1<=n&&n<=100000);
assert(1<=q&&q<=100000);
for (int i = 0; i < n; i++) {
int a;
scanf("%d", &a);
assert(1<=a);
assert(a<=1000000000);
v.push_back(a);
vv.push_back(a);
}
sort(vv.begin(), vv.end());
for (int i = 0; i < v.size(); i++) {
v[i] = lower_bound(vv.begin(), vv.end(), v[i]) - vv.begin();
idx[v[i]].push_back(i);
}
for (int i = 0; i < n; i+=MAGIC) {
memset(ex, false, sizeof(ex));
for (int j = i; j < n; j++) {
if (ex[v[j]])continue;
ex[v[j]] = true;
u[i / MAGIC][sz[i / MAGIC]] = v[j];
sz[i / MAGIC]++;
if(sz[i/MAGIC]==MM)break;
}
}
int las = 0;
while (q--) {
int a,b;
scanf("%d%d", &a, &b);
assert(1<=a&&a<=n&&1<=b&&b<=n);
int l = (a + las) % n + 1;
int r = (b + las) % n + 1;
l--;
r--;
assert(0<=l&&0<=r);
int belong = l / MAGIC;
s.clear();
bool en = false;
for (int i = 0; i < sz[belong]; i++) {
int val = u[belong][i];
int lef = lower_bound(idx[val].begin(), idx[val].end(), l) - idx[val].begin();
int rig = upper_bound(idx[val].begin(), idx[val].end(), r) - idx[val].begin();
int oc = rig - lef;
if (oc == 0)continue;
if (s.count(oc)) {
en = true;
break;
}
s.insert(oc);
}
if (en) {
puts("0");
las = 0;
continue;
}
if (s.size() == 1) {
puts("-1");
las = -1;
continue;
}
int ans = INT_MAX;
int pr = -1;
for (auto el : s) {
if (pr != -1) {
ans = min(ans, el - pr);
}
pr = el;
}
printf("%dn", ans);
las = ans;
}
return 0;
}
coding problems

Post navigation

Previous post
Next post
  • How AI Is Revolutionizing Personalized Learning in Schools
  • GTA 5 is the Game of the Year for 2024 and 2025
  • Hackerrank Day 5 loops 30 days of code solution
  • Hackerrank Day 6 Lets Review 30 days of code solution
  • Hackerrank Day 14 scope 30 days of code solution
©2025 Programming101 | WordPress Theme by SuperbThemes