Egor has come up with a hard problem for a training camp! Here it is:
Given an array a of n positive integers sorted in increasing order, find 4 indices i<j<p<q such that a_i⋅a_q=a_j⋅a_p.
He then wrote the checker to this problem:
// returns true if the solution is found,
// returns false if the solution is not found,
// makes the verdict Wrong Answer right away if the found solution is not valid
bool getAnswer(InStream &stream, vector<long long> a) {
string s = stream.readToken("NO|YES"); // PE if the string is not NO or YES
if (s == "NO") return false;
vector<int> b = stream.readInts(4, 1, (int)a.size()); // 4 indices between 1 and n
int i = b[0] - 1, j = b[1] - 1, p = b[2] - 1, q = b[3] - 1; // -1 to make 0-indexed
stream.ensuref(i < j && j < p && p < q, "4 indices should be in increasing order");
stream.ensuref(a[q] / a[p] == a[j] / a[i], "the products are not equal");
return true;
}
The multiplication will overflow long long, so Egor used division instead. How smart! Although now Egor might have another problem...
The first line contains one integer n (4≤n≤500,000) --- the size of the array.
The second line contains the array a_1,a_2,…,a_n itself (1≤a_1<a_2<…<a_n≤1018).
On the first line print "YES" if there is a solution and print "NO" otherwise.
If a solution exists, print the 4 chosen indices in order i,j,p,q, separated by spaces. If there is more than one solution, you can print any one.