Advertisement
Guest User

Untitled

a guest
Jan 19th, 2015
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. #include <cstdio>
  2. using namespace std;
  3.  
  4. template <class T>
  5. void array_part_max (T *Source, size_t size) { // O(n)
  6.     if (size >= 2) {
  7.         for (long long int it = size - 2; it >= 0; --it) {
  8.             if (Source[it] < Source[it+1])
  9.                 Source[it] = Source[it+1];
  10.         }
  11.         Source[size] = Source[size-1];
  12.     }
  13. }
  14.  
  15. int main () {
  16.     int n, temp, max_h, tempb, i, first, z;
  17.     int Last[100005], First[100005];
  18.     int max_diff, max_a, max_b;
  19.  
  20.     scanf("%d", &z);
  21.     while (z--) {
  22.         for (i = 0; i < 100005; ++i)
  23.             Last[i] = First[i] = -1;
  24.  
  25.         scanf("%d %d", &n, &first);
  26.         tempb = max_h = first;
  27.         Last[first] = First[first] = 0;
  28.         for (i = 1; i < n; ++i) {
  29.             scanf("%d", &temp);
  30.             Last[temp] = i;
  31.             if (First[temp] == -1)
  32.                 First[temp] = i;
  33.  
  34.             if (temp > max_h)
  35.                 max_h = temp;
  36.  
  37.             if (temp > tempb)
  38.                 break;
  39.  
  40.             tempb = temp;
  41.         }
  42.  
  43.         if (i == n) {
  44.             printf("NIE\n");
  45.             continue;
  46.         }
  47.  
  48.         for (++i; i < n; ++i) {
  49.             scanf("%d", &temp);
  50.             Last[temp] = i;
  51.             if (First[temp] == -1)
  52.                 First[temp] = i;
  53.  
  54.             if (temp > max_h)
  55.                 max_h = temp;
  56.         }
  57.  
  58.         if (first < temp) {
  59.             printf("0 %d\n", n-1);
  60.             continue;
  61.         }
  62.  
  63.         array_part_max <int> (Last, max_h + 1);
  64.  
  65.         max_diff = 0, max_a = 10000001;
  66.         for (i = 1; i < max_h; ++i) {
  67.             if (First[i] != -1 &&
  68.                     ((Last[i+1] - First[i] == max_diff && max_a > First[i])     ||      (Last[i+1] - First[i] > max_diff))) {
  69.                 max_diff = Last[i+1] - First[i];
  70.                 max_a = First[i], max_b = Last[i+1];
  71.             }
  72.         }
  73.         printf("%d %d\n", max_a, max_b);
  74.     }
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement