// C++ program to find the minimum
// distance between two elements
// with value 0 within a subarray (l, r)
#include <bits/stdc++.h>
using namespace std;
// Structure for each node
// in the segment tree
struct node {
int l0, r0;
int min0;
} seg[100001];
// A utility function for
// merging two nodes
node task(node l, node r)
{
node x;
x.l0 = (l.l0 != -1) ? l.l0 : r.l0;
x.r0 = (r.r0 != -1) ? r.r0 : l.r0;
x.min0 = min(l.min0, r.min0);
// If both the nodes are valid
if (l.r0 != -1 && r.l0 != -1)
// Computing the minimum distance to store
// in the segment tree
x.min0 = min(x.min0, r.l0 - l.r0);
return x;
}
// A recursive function that constructs
// Segment Tree for given string
void build(int qs, int qe, int ind, int arr[])
{
// If start is equal to end then
// insert the array element
if (qs == qe) {
if (arr[qs] == 0) {
seg[ind].l0 = seg[ind].r0 = qs;
seg[ind].min0 = INT_MAX;
}
else {
seg[ind].l0 = seg[ind].r0 = -1;
seg[ind].min0 = INT_MAX;
}
return;
}
int mid = (qs + qe) >> 1;
// Build the segment tree
// for range qs to mid
build(qs, mid, ind << 1, arr);
// Build the segment tree
// for range mid+1 to qe
build(mid + 1, qe, ind << 1 | 1, arr);
// Merge the two child nodes
// to obtain the parent node
seg[ind] = task(seg[ind << 1],
seg[ind << 1 | 1]);
}
// Query in a range qs to qe
node query(int qs, int qe, int ns, int ne, int ind)
{
node x;
x.l0 = x.r0 = -1;
x.min0 = INT_MAX;
// If the range lies in this segment
if (qs <= ns && qe >= ne)
return seg[ind];
// If the range is out of the bounds
// of this segment
if (ne < qs || ns > qe || ns > ne)
return x;
// Else query for the right and left
// child node of this subtree
// and merge them
int mid = (ns + ne) >> 1;
node l = query(qs, qe, ns, mid, ind << 1);
node r = query(qs, qe, mid + 1, ne, ind << 1 | 1);
x = task(l, r);
return x;
}
// Driver code
int main()
{
int arr[] = { 1, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 1, 0 };
int n = sizeof(arr) / sizeof(arr[0]);
// Build the segment tree
build(0, n - 1, 1, arr);
// Queries
int Q[][2] = { { 3, 9 }, { 10, 13 } };
for (int i = 0; i < 2; i++) {
// Finding the answer for every query
// and printing it
node ans = query(Q[i][0], Q[i][1],
0, n - 1, 1);
cout << ans.min0 << endl;
}
return 0;
}