Given n ranges of the form L and R , the task is to find the maximum occurred integer in all the ranges. If more than one such integer exists, print the smallest one.
Task # 1
0 <= L[i] , R[i] < 1000000.
Task # 2
0 <= L[i], R[i] < 1000000000.
Task 1 can be easily done with the below algorithm
- Initialize an array arr[] to 0.
- For each range i, add +1 at Li index and -1 at Ri of the array.
- Find the prefix sum of the array and find the smallest index having maximum prefix sum.
For task #2 it is impossible to make an array of 1e9 , so how we do that , Help please.
1 Like
The main idea, then, is coordinate compression - notice that the only positions you would possibly have to care about are those at the endpoints of updates.
1 Like
Or, if you’re lazy, you could copy/paste in a sparse lazy RMQ segment tree
. Probably simpler to do coordinate compression.
1 Like
Let us visualize the ranges like this

Now the answer will be the the least x which will intersect maximum “red horizontal lines” (ranges). I think you can proceed with Sweep-line technique by storing only the points (both L and R), sorting and then iterating.
I also think that the answer will be one of the points in the given lists (not sure though)
check out this problem and this solution for similar implementation details.
1 Like
The hint they give actually reveals a very clean implementation:
code
/* template */
int main() {
int Q; cin >> Q;
map<long long, int> points;
for (int i = 0; i < Q; i++) {
long long l, r; cin >> l >> r;
points[l]++;
points[r + 1]--;
}
int best = 0, cur = 0;
for (pair<long long, int> x: points) {
cur += x.second;
best = max(best, cur);
}
cout << best << '\n';
}
1 Like
Here, best is the maximum frequency of some integers in whole range (i mean after all queries) but we have to output that integer which is minimum from the all maximum occurred integer. I think this
would work . btw, Thank you so much 
int cur = 0, prev = 0, ans;
for (auto x : points) {
cur += x.second;
if (cur > prev) {
ans = x.first;
prev = cur;
}
}
cout << ans << '\n';
1 Like