Almost Increasing Subsequence (Codeforces 1818C)
Tags: Greedy, binary search

A sequence is almost-increasing if it does not contain three consecutive elements $$$x, y, z$$$ such that $$$x\ge y\ge z$$$.You are given an array $$$a_1, a_2, \dots, a_n$$$ and $$$q$$$ queries.Each query consists of two integers $$$1\le l\le r\le n$$$. For each query, find the length of the longest almost-increasing subsequence of the subarray $$$a_l, a_{l+1}, \dots, a_r$$$. A subsequence is a sequence that can be derived from the given sequence by deleting zero or more elements without changing the order of the remaining elements.

Input: The first line of input contains two integers, $$$n$$$ and $$$q$$$ ($$$1 \leq n, q \leq 200\,000$$$)  — the length of the array $$$a$$$ and the number of queries.The second line contains $$$n$$$ integers $$$a_1, a_2, \dots, a_n$$$ ($$$1 \leq a_i \leq 10^9$$$)  — the values of the array $$$a$$$.Each of the next $$$q$$$ lines contains the description of a query. Each line contains two integers $$$l$$$ and $$$r$$$ ($$$1 \leq l \leq r \leq n$$$)  — the query is about the subarray $$$a_l, a_{l+1}, \dots, a_r$$$.

Output: For each of the $$$q$$$ queries, print a line containing the length of the longest almost-increasing subsequence of the subarray $$$a_l, a_{l+1}, \dots, a_r$$$.

Note: In the first query, the subarray is $$$a_1, a_2, a_3 = [1,2,4]$$$. The whole subarray is almost-increasing, so the answer is $$$3$$$.In the second query, the subarray is $$$a_1, a_2, a_3,a_4 = [1,2,4,3]$$$. The whole subarray is a almost-increasing, because there are no three consecutive elements such that $$$x \geq y \geq z$$$. So the answer is $$$4$$$.In the third query, the subarray is $$$a_2, a_3, a_4, a_5 = [2, 4, 3, 3]$$$. The whole subarray is not almost-increasing, because the last three elements satisfy $$$4 \geq 3 \geq 3$$$. An almost-increasing subsequence of length $$$3$$$ can be found (for example taking $$$a_2,a_3,a_5 = [2,4,3]$$$ ). So the answer is $$$3$$$.

Sample Inputs:
9 8
1 2 4 3 3 5 6 2 1
1 3
1 4
2 5
6 6
3 7
7 8
1 8
8 8

Sample Outputs:
3
4
3
1
4
2
7
1

Solution (Python):
import sys
input = sys.stdin.readline
R = lambda : list(map(int, input().split()))
(n, q) = R()
a = R()
res = [0] * n
for i in range(2, n):
    res[i] = res[i - 1] + int(a[i - 2] >= a[i - 1] >= a[i])
for i in range(q):
    (l, r) = R()
    print(r - l + 1 if r - l + 1 < 3 else r - l + 1 - res[r - 1] + res[l])

Solution (Python):
import sys
input = sys.stdin.readline
(n, q) = map(int, input().split())
a = list(map(int, input().split()))
prefix_sum = [0 for i in range(n - 1)]
for i in range(1, n - 1):
    prefix_sum[i] = prefix_sum[i - 1] + int(a[i - 1] >= a[i] >= a[i + 1])
for _ in range(q):
    (l, r) = map(int, input().split())
    l -= 1
    r -= 1
    if l == r:
        print(1)
    else:
        ans = r - l + 1 - prefix_sum[r - 1] + prefix_sum[l]
        print(ans)

Solution (Python):
import sys
input = sys.stdin.readline
R = lambda : list(map(int, input().split()))
(n, q) = R()
a = R()
res = [0] * n
for i in range(2, n):
    res[i] = res[i - 1] + int(a[i - 2] >= a[i - 1] >= a[i])
for i in range(q):
    (l, r) = R()
    print(r - l + 1 if r - l + 1 < 3 else r - l + 1 - res[r - 1] + res[l])