using System;
using System.Collections.Generic;
class GFG {
// build segment tree for max
static void buildTree(int idx, int l, int r, int[] seg, int[] A) {
// leaf node
if (l == r) {
seg[idx] = A[l];
return;
}
// midpoint
int mid = (l + r) / 2;
// build left subtree
buildTree(2 * idx, l, mid, seg, A);
// build right subtree
buildTree(2 * idx + 1, mid + 1, r, seg, A);
// store maximum
seg[idx] = Math.Max(seg[2 * idx], seg[2 * idx + 1]);
}
// query maximum
static int queryMax(int idx, int l, int r, int L, int R, int[] seg) {
if (r < L || l > R)
return -1;
if (L <= l && r <= R)
return seg[idx];
int mid = (l + r) / 2;
return Math.Max(
queryMax(2 * idx, l, mid, L, R, seg),
queryMax(2 * idx + 1, mid + 1, r, L, R, seg)
);
}
// check launch
static bool canLaunch(int Apos, int Bpos, int[] A, int[] seg, int n) {
Apos--;
Bpos--;
if (Apos + 1 > Bpos - 1)
return true;
int mx = queryMax(1, 0, n - 1, Apos + 1, Bpos - 1, seg);
return mx < Math.Min(A[Apos], A[Bpos]);
}
// count launches
static int countLaunches(int[] A, int[,] queries) {
int n = A.Length;
int[] seg = new int[4 * n];
buildTree(1, 0, n - 1, seg, A);
int successful = 0;
int q = queries.GetLength(0);
for (int i = 0; i < q; i++) {
int a = queries[i, 0];
int b = queries[i, 1];
if (canLaunch(a, b, A, seg, n))
successful++;
}
return successful;
}
static void Main() {
int[] A = {2, 3, 5, 4, 2, 1, 6};
int[,] queries = {
{3, 5},
{2, 5},
{4, 6}
};
Console.WriteLine(countLaunches(A, queries));
}
}