Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- using namespace std;
- template <class T>
- void array_part_max (T *Source, size_t size) { // O(n)
- if (size >= 2) {
- for (long long int it = size - 2; it >= 0; --it) {
- if (Source[it] < Source[it+1])
- Source[it] = Source[it+1];
- }
- Source[size] = Source[size-1];
- }
- }
- int main () {
- int n, temp, max_h, tempb, i, first, z;
- int Last[100005], First[100005];
- int max_diff, max_a, max_b;
- scanf("%d", &z);
- while (z--) {
- for (i = 0; i < 100005; ++i)
- Last[i] = First[i] = -1;
- scanf("%d %d", &n, &first);
- tempb = max_h = first;
- Last[first] = First[first] = 0;
- for (i = 1; i < n; ++i) {
- scanf("%d", &temp);
- Last[temp] = i;
- if (First[temp] == -1)
- First[temp] = i;
- if (temp > max_h)
- max_h = temp;
- if (temp > tempb)
- break;
- tempb = temp;
- }
- if (i == n) {
- printf("NIE\n");
- continue;
- }
- for (++i; i < n; ++i) {
- scanf("%d", &temp);
- Last[temp] = i;
- if (First[temp] == -1)
- First[temp] = i;
- if (temp > max_h)
- max_h = temp;
- }
- if (first < temp) {
- printf("0 %d\n", n-1);
- continue;
- }
- array_part_max <int> (Last, max_h + 1);
- max_diff = 0, max_a = 10000001;
- for (i = 1; i < max_h; ++i) {
- if (First[i] != -1 &&
- ((Last[i+1] - First[i] == max_diff && max_a > First[i]) || (Last[i+1] - First[i] > max_diff))) {
- max_diff = Last[i+1] - First[i];
- max_a = First[i], max_b = Last[i+1];
- }
- }
- printf("%d %d\n", max_a, max_b);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement