智乃的最大子段和取模
题号:NC307035
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
Special Judge, 64bit IO Format: %lld

题目描述

\hspace{15pt}对于一个长度为 n 的数组 a_0,a_1,\cdots,a_{n-1},给定 l,r\left(0 \leq l \leq r < n\right),定义 \textrm{sum}(l,r)=\sum\limits_{i=l}^{r}a_i 为数组 a 的子段和。如果 l',r' 是使 \textrm{sum}(l,r) 在所有 l,r 的取值中达到了最大值,则称 \textrm{sum}(l',r') 是最大子段和。

\hspace{15pt}现在给定一个常数 p,智乃想要知道,如果在求得最大子段和的过程中p 取模,那么取模后数组整体的最大子段和应该是多少?
\hspace{15pt}形式化的:记 S(l,r) = \textrm{sum}(l,r) \bmod p =\Big(\sum\limits_{i=l}^{r}a_i\Big)\bmod p,请找到一对 l',r' 使得 S(l,r) 成为最大值,输出 l'r'、这个最大值。如果有多种可行的答案,你可以输出任意符合条件的 l',r'

\hspace{15pt}请注意:本题需要输出在计算过程中取模后的子段和的最大值,而不是传统意义上的最大子段和对答案取模。

【名词解释】
\hspace{15pt}\bmod:代表取模运算。例如,5 除以 3 的余数为 2,因此式子 5 \bmod 3 的值为 2

输入描述:

\hspace{15pt}第一行输入两个正整数 n,p \left(1\leq n \leq 10^5;\, 1 \leq p \leq 10^9\right),表示数组的长度、模数。
\hspace{15pt}第二行输入 n 个非负整数 a_0,a_1,\dots,a_{n-1} \left(0\leq a_i <p\right),表示数组中的元素。

输出描述:

\hspace{15pt}在一行中输出三个整数,分别表示 l'r'、取模后的最大子段和。

\hspace{15pt}如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。
示例1

输入

复制
5 10
6 9 1 9 1

输出

复制
1 3 9

说明

\hspace{15pt}在这个样例中,注意下标从 0 开始计算,(a_1+a_2+a_3)\bmod 10=(9+1+9)\bmod 10=9
示例2

输入

复制
5 10
4 7 2 7 9

输出

复制
0 4 9