RT,自认为码风不错
#include <bits/stdc++.h>
#define LC p << 1
#define RC p << 1 | 1
using namespace std;
const int N = 1e6 + 5;
int a[N], n, m, c, INF = 0x7fffffff;
struct P4392 {
int l, r, MaxVal, MinVal;
} t[N << 3];
void PushUp(int p) {
t[p].MinVal = min(t[LC].MinVal, t[RC].MinVal);
t[p].MaxVal = max(t[LC].MaxVal, t[RC].MaxVal);
}
void Build(int p, int l, int r) {
t[p].l = l, t[p], r = r;
if (l == r) {
t[p].MaxVal = t[p].MinVal = a[l];
return;
}
int mid = (l + r) >> 1;
Build(LC, l, mid);
Build(RC, mid + 1, r);
PushUp(p);
return;
}
int Range_Ask_Max(int p, int l, int r) {
if (t[p].l >= l && t[p].r <= r)
return t[p].MaxVal;
int mid = (t[p].l + t[p].r) >> 1, ans = -INF;
if (l <= mid)
ans = max(ans, Range_Ask_Max(LC, l, r));
if (r > mid)
ans = max(ans, Range_Ask_Max(RC, l, r));
return ans;
}
int Range_Ask_Min(int p, int l, int r) {
if (t[p].l >= l && t[p].r <= r)
return t[p].MinVal;
int mid = (t[p].l + t[p].r) >> 1, ans = INF;
if (l <= mid)
ans = min(ans, Range_Ask_Min(LC, l, r));
if (r > mid)
ans = min(ans, Range_Ask_Min(RC, l, r));
return ans;
}
int main() {
bool flag = 0;
scanf("%d%d%d", &n, &m, &c);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
Build(1, 1, n);
for (int i = 1; i <= n - m + 1; i++) {
if (Range_Ask_Max(1, i, i + m - 1) - Range_Ask_Min(1, i, i + m - 1) <= c) {
printf("%d\n", i);
flag = 1;
}
}
if (!flag)
printf("NONE\n");
system("pause");
return 0;
}