枚举右边的客栈,每次都先找距离当前客栈最近的蛮族最低消费小于p的客栈
(可以用一个数组来记录最近的小于p的客栈, 如果第i个咖啡小于p,那么vis[i]=i,否则 vis[i]=vis[i-1]
然后再计算最近的客栈左边的颜色和当前客栈相同的颜色的数量,加上即可
(颜色数量可以用一个二维数组保存,最多只有50个颜色

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
int n,m,k,p,vis[200005],res[55][200005],s[200005],z[200005];
int main ()
{
    int T,i,t,j;
    cin>>n>>k>>p;
    for(i=1;i<=n;++i){
        cin>>s[i]>>z[i];
        if(z[i]<=p)
            vis[i]=i;
        else 
            vis[i]=vis[i-1];

        res[s[i]][i]++;
        for(int v=0;v<k;++v)
            res[v][i]+=res[v][i-1];
    }
    ll sum=0;
    for(i=2;i<=n;++i){
        sum+=res[s[i]][vis[i]];
        if(z[i]<=p)
            sum--;
    }
    cout<<sum<<endl;
    return 0;
}