func_code_string: #include <bits/stdc++.h>   using namespace std;   long long n, k;   struct ff {     int value, order;   } a[100010];   bool cmp(ff a, ff b) { return a.value < b.value; }   long long sum1[100010], sum2[100010];   void add(long long s[], int i, int x) {     while (i <= n) {       s[i] += x;       i += i & -i;     }   }   long long getsum(long long s[], int i) {     long long res = 0;     while (i > 0) {       res += s[i];       i -= i & -i;     }     return res;   }   int b[100010];   int main() {     while (~scanf( %I64d%I64d , &n, &k)) {       for (int i = 1; i <= n; i++) {         scanf( %d , &a[i].value);         a[i].order = i;         b[i - 1] = a[i].value;       }       sort(b, b + n);       int m = unique(b, b + n) - b;       for (int i = 1; i <= n; i++) {         a[i].order = lower_bound(b, b + m, a[i].value) - b + 1;       }       memset(sum1, 0, sizeof sum1);       memset(sum2, 0, sizeof sum2);       long long res = 0;       long long ans = 0;       for (int i = 1; i <= n; i++) {         add(sum1, a[i].order, 1);         res += i - getsum(sum1, a[i].order);       }       if (res <= k) {         printf( %I64d n , n * (long long)(n - 1) / 2);         continue;       }       add(sum1, a[n].order, -1);       add(sum2, a[n].order, 1);       for (int l = n - 1, r = n - 1; r > 0; r--) {         while (l > 0 && res > k) {           res -= l - getsum(sum1, a[l].order);           res -= getsum(sum2, a[l].order - 1);           add(sum1, a[l].order, -1);           l--;         }         if (l == 0) break;         ans += l;         res += getsum(sum2, a[r].order - 1);         res += l - getsum(sum1, a[r].order);         add(sum2, a[r].order, 1);       }       cout << ans << endl;     }     return 0;   }   