// O(n) megoldás
// Legyen F(m)=|{i | a[i]>=c és i<=m}|, azaz c-nél nem kisebb tagok száma az első m tag között
// Belátható, hogy (a[k],..,a[m]) pontosan akkor értékes, ha F(m)-F(k-1)>=(m-k+1)/2 ( és k<=m )
// Legyen G(m)=2*F(m)-m
// Kell: G(m)-G(k-1)>=0, azaz G(k-1)<=G(m) ( és persze k<=m )
// Legyen H(m)=G(m)+n, ekkor 0<=H(m)<=2*n
// Legyen (adott m-re): T[p]=|{i | i<m és H(i)<=p}|
// Ki fogjuk használni, hogy abs(H(m)-H(m+1))<=1
// ezzel tree-k helyett tároljuk, hogy mennyivel kell majd növelni a T[] tömb elemeit
// módosításokat az inc[] tömbben tároljuk: T[p]+sum(inc[x]:x<=p) a pontos érték
// adott v=H(m) esetén inc[p]=0 lesz, ha p<=v+1, így
// a következő pozicíóban is a T[] tömb eleme pontos lesz ( hiszen H(m+1)<=v+1 )
#include <iostream>
#include <new>
using namespace std;
int main(void){
int *T,*inc,h,i,n,a,c,count,u;
long long int answer;
cin>>n>>c;
T=new int[2*n+4];
inc=new int[2*n+4];
for(i=0;i<2*n+4;i++)T[i]=0,inc[i]=0;
answer=0;
count=0;
for(i=1;i<=n;i++){
cin>>a;
count+=(a>=c);
h=2*count-i+n;
answer+=T[h];
T[h]++;// inc[h]=0 volt
u=inc[h+1]+1;T[h+1]+=u;inc[h+1]=0;inc[h+2]+=u;// T[h+1] beállítása, most már h+1-ig minden T[] érték pontos
answer+=(count>=(i+1)/2); // egész sorozat eddig értékes-e
}
cout<<answer<<endl;
return 0;
}
Ly8gTyhuKSBtZWdvbGTDoXMKLy8gTGVneWVuIEYobSk9fHtpIHwgYVtpXT49YyDDqXMgaTw9bX18LCBhemF6IGMtbsOpbCBuZW0ga2lzZWJiIHRhZ29rIHN6w6FtYSBheiBlbHPFkSBtIHRhZyBrw7Z6w7Z0dAovLyBCZWzDoXRoYXTDsywgaG9neSAoYVtrXSwuLixhW21dKSBwb250b3NhbiBha2tvciDDqXJ0w6lrZXMsIGhhIEYobSktRihrLTEpPj0obS1rKzEpLzIgKCDDqXMgazw9bSApCi8vIExlZ3llbiBHKG0pPTIqRihtKS1tCi8vIEtlbGw6IEcobSktRyhrLTEpPj0wLCBhemF6IEcoay0xKTw9RyhtKSAoIMOpcyBwZXJzemUgazw9bSApCi8vIExlZ3llbiBIKG0pPUcobSkrbiwgZWtrb3IgMDw9SChtKTw9MipuCgovLyBMZWd5ZW4gKGFkb3R0IG0tcmUpOiBUW3BdPXx7aSB8IGk8bSDDqXMgSChpKTw9cH18Ci8vIEtpIGZvZ2p1ayBoYXN6bsOhbG5pLCBob2d5IGFicyhIKG0pLUgobSsxKSk8PTEKLy8gZXp6ZWwgdHJlZS1rIGhlbHlldHQgdMOhcm9sanVrLCBob2d5IG1lbm55aXZlbCBrZWxsIG1hamQgbsO2dmVsbmkgYSBUW10gdMO2bWIgZWxlbWVpdAovLyBtw7Nkb3PDrXTDoXNva2F0IGF6IGluY1tdIHTDtm1iYmVuIHTDoXJvbGp1azogVFtwXStzdW0oaW5jW3hdOng8PXApIGEgcG9udG9zIMOpcnTDqWsKLy8gYWRvdHQgdj1IKG0pIGVzZXTDqW4gaW5jW3BdPTAgbGVzeiwgaGEgcDw9disxLCDDrWd5Ci8vIGEga8O2dmV0a2V6xZEgcG96aWPDrcOzYmFuIGlzIGEgVFtdIHTDtm1iIGVsZW1lIHBvbnRvcyBsZXN6ICggaGlzemVuIEgobSsxKTw9disxICkKCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG5ldz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7ICAKCmludCBtYWluKHZvaWQpewogIAogIGludCAqVCwqaW5jLGgsaSxuLGEsYyxjb3VudCx1OwogIGxvbmcgbG9uZyBpbnQgYW5zd2VyOwogIAogIGNpbj4+bj4+YzsgIAogIAogIFQ9bmV3IGludFsyKm4rNF07CiAgaW5jPW5ldyBpbnRbMipuKzRdOwogIGZvcihpPTA7aTwyKm4rNDtpKyspVFtpXT0wLGluY1tpXT0wOwogIAogIGFuc3dlcj0wOwogIGNvdW50PTA7CiAgZm9yKGk9MTtpPD1uO2krKyl7CiAgICAgIGNpbj4+YTsKICAgIAogICAgICBjb3VudCs9KGE+PWMpOwogICAgICAKICAgICAgaD0yKmNvdW50LWkrbjsKICAgICAgYW5zd2VyKz1UW2hdOwogICAgICAKICAgICAgVFtoXSsrOy8vIGluY1toXT0wIHZvbHQKICAgICAgdT1pbmNbaCsxXSsxO1RbaCsxXSs9dTtpbmNbaCsxXT0wO2luY1toKzJdKz11Oy8vIFRbaCsxXSBiZcOhbGzDrXTDoXNhLCBtb3N0IG3DoXIgaCsxLWlnIG1pbmRlbiBUW10gw6lydMOpayBwb250b3MKCiAgICAgIGFuc3dlcis9KGNvdW50Pj0oaSsxKS8yKTsgLy8gZWfDqXN6IHNvcm96YXQgZWRkaWcgw6lydMOpa2VzLWUKICB9CiAgCiAgY291dDw8YW5zd2VyPDxlbmRsOwogIHJldHVybiAwOwp9Cg==