### 题目解析
有一组长度为n的整数序列{ai},表示一系列树木的美学评分。面对m次查询,每次查询提供三个整数l、r和P,需要计算并返回所有满足l
#include
#include
#include
#include
#include
#define LL long long
#define LD double
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a>b)?b:a)
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
int const inf=2147483647;
int const maxn=5*1e4, maxp=100;
int n, m, a[maxn+10], t[maxp+10];
void update(int pos) {
int p = pos;
while(p <= maxp) {
t[p] = max(t[p], pos);
p += p & (-p);
}
}
int query(int p) {
int ans = 0;
while(p > 0) {
ans = max(ans, t[p]);
p -= p & (-p);
}
return ans;
}
int main() {
//freopen("psy.in", "r", stdin);
//freopen("psy.out", "w", stdout);
freopen("garden.in", "r", stdin);
freopen("garden.out", "w", stdout);
scanf("%d%d", &n, &m);
fo(i, 1, n) scanf("%d", &a[i]);
fo(i, 1, m) {
int l, r, p; scanf("%d%d%d", &l, &r, &p);
if (r - l + 2 > p) printf("0\n");
else {
fo(j, 0, p) t[j] = 0;
int sum = 0, ans = inf;
update(1);
fo(j, l, r) {
sum = (sum + a[j]) % p;
if (query(sum + 1)) ans = min(ans, sum + 1 - query(sum + 1));
update(sum + 1);
}
printf("%d\n", ans);
}
}
return 0;
}
```
此代码首先读取输入数据,包括树木的数量n、查询次数m以及每个树木的美学值。对于每个查询,如果区间长度大于模数P,则直接输出0;否则,使用树状数组来动态更新和查询最小子序列和模P后的最小值。