读题发现只要查询当前年份是否得奖 以及 之后区间的大于等于最后一次的成绩排名 即可
经典主席树之 静态区间内大于等于k的个数
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
using LL = long long;
constexpr int N = 3e5 + 5, mod = 998244353;
constexpr double eps = 1e-8;
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#define fi first
#define se second
// #define int long long
#define lowbit(x) (x & (-x))
#define PII pair<int, int>
#define mid ((l + r) >> 1)
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
int n, k;
int a[N], rnk[N], p[N], f[N], tot, b[N];
int root[N];
int ls[N * 40], rs[N * 40], val[N * 40];
int bn = 1e5 + 1;
void update(int &u, int v, int l, int r, int p, int z){
u = ++ tot;
ls[u] = ls[v], rs[u] = rs[v];
val[u] = val[v];
val[u] += z;
if(l == r)return;
if(p <= mid)update(ls[u], ls[v], l, mid, p, z);
else update(rs[u], rs[v], mid + 1, r, p, z);
}
int query(int u, int v, int l, int r, int k){
if(l == r)return val[u] - val[v];
if(k <= mid)return query(ls[u], ls[v], l, mid, k);
else return query(rs[u], rs[v], mid + 1, r, k) + (val[ls[u]] - val[ls[v]]);
}
void Sakuya()
{
cin >> n >> k;
for(int i = 1; i <= n; ++ i)cin >> rnk[i];
for(int i = 1; i <= k; ++ i){
cin >> a[i] >> p[i] >> f[i];
}// 最后一次比赛年份 排名 持续关注时间
for(int i = 1; i <= n; ++ i){
update(root[i], root[i - 1], 1, bn, rnk[i], 1);
}
for(int i = 1; i <= k; ++ i){
if(rnk[a[i]] >= p[i]){
cout << 0 << "\n";
}else {
cout << f[i] - query(root[a[i] + f[i]], root[a[i]], 1, bn, p[i] - 1) << "\n";
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
// int T;
// for (cin >> T; T -- ; )
Sakuya();
}