#include using namespace std; #define MAX_LEN 1000000+42 #define MAX_LEN_SQRT 1000+42 int arr[MAX_LEN]; int bins_max[MAX_LEN_SQRT]; int bins_min[MAX_LEN_SQRT]; int32_t main() { int N; scanf("%d", &N); int sqrt_N = sqrt(N) + 1; // init bins_min for (int i = 0; i < sqrt_N; i++) { bins_min[i] = INT_MAX; } // read input // printf("INPUT\n"); for (int i = 0; i < N; i++) { int bin = i / sqrt_N; scanf("%d", &arr[i]); bins_max[bin] = max(bins_max[bin], arr[i]); bins_min[bin] = min(bins_min[bin], arr[i]); // printf("%d ", arr[i]); } // printf("\n"); // printf("BINS\n"); // for (int i = 0; i < N; i++) { // int bin = i / sqrt_N; // printf("%d ", bin); // } // printf("\n"); // printf("BIN_MAX\n"); // for (int i = 0; i < sqrt_N; i++) { // printf("%d ", bins_max[i]); // } // printf("\n"); // printf("BIN_MIN\n"); // for (int i = 0; i < sqrt_N; i++) { // printf("%d ", bins_min[i]); // } // printf("\n"); // printf("BIN_RANGE\n"); // for (int i = 0; i < sqrt_N; i++) { // int bin_low = i * sqrt_N; // int bin_high = (i+1) * sqrt_N; // printf("%d-%d; ", bin_low, bin_high); // } // printf("\n"); // printf("\n"); int64_t total_length = 0; for (int i = 0; i < N; i++) { // printf("-- from idx %d (h: %d)\n", i, arr[i]); int height = arr[i]; // we need to only consider bins to the right int b_start = (i + 1) / sqrt_N; // FIX: always search current bin and then at most one other bool flag = false; for (int b = b_start; b < sqrt_N; b++) { if (bins_max[b] >= height) { // search this bin // printf("searching bin %d\n", b); // -------------------------------- if (bins_min[b] > height) { // no need to search, exit break; } // find bin bounds int bin_low = b * sqrt_N; int bin_high = (b + 1) * sqrt_N; // if start already too high, exit if (bin_low >= N) { break; } // limit end bin_high = min(bin_high, N); // start on the right of current pos bin_low = max(bin_low, i + 1); // search the bin for (int j = bin_low; j < bin_high; j++) { // found >= height if (arr[j] > height) { flag = true; break; } else if (arr[j] == height) { int length = j - i - 1; // printf("found at idx %d, l: %d\n", j, length); total_length += length; flag = true; break; } } // don't search others if (flag) { break; } else { flag = true; } } } } printf("%ld\n", total_length); return 0; }