我想用差分实现单 log,但为什么反而挂了呢?
#include <bits/stdc++.h>
#define N 600005
#define ll unsigned long long
using namespace std;
inline int read() {
int res = 0; char c = getchar();
while (c < '0' || c > '9') { c = getchar(); }
while (c >= '0' && c <= '9') { res = (res << 1) + (res << 3) + (c ^ 48); c = getchar(); }
return res;
}
int n, m, p[N], k, q[N], ans[N];
ll cnt[N], c[N], be[N];
struct rain {
int l, r;
ll a;
} ra[N];
inline void solve(int l, int r, int q[], int len) {
if (!len) return ;
if (l == r) {
for (int i = 1; i <= len; ++i) ans[q[i]] = l;
return ;
}
int mid = (l + r) >> 1;
for (int i = 1; i <= mid; ++i) {
if (ra[i].l > ra[i].r) {
c[ra[i].l] += ra[i].a;
c[1] += ra[i].a;
c[ra[i].r + 1] -= ra[i].a;
}
else {
c[ra[i].l] += ra[i].a;
c[ra[i].r + 1] -= ra[i].a;
}
}
for (int i = 1; i <= m; ++i) cnt[be[i]] += (c[i] += c[i - 1]), c[i - 1] = 0;
c[m] = c[m + 1] = 0;
int q1[len + 5] = {0}, q2[len + 5] = {0}, len1 = 0, len2 = 0;
for (int i = 1; i <= len; ++i) {
if (cnt[q[i]] >= p[q[i]]) q1[++len1] = q[i];
else q2[++len2] = q[i];
}
for (int i = 1; i <= m; ++i) cnt[be[i]] = 0;
c[m + 1] = 0;
solve(l, mid, q1, len1);
solve(mid + 1, r, q2, len2);
}
int main() {
n = read(), m = read();
for (int i = 1; i <= m; ++i) be[i] = read();
for (int i = 1; i <= n; ++i) p[i] = read();
k = read();
for (int i = 1; i <= k; ++i) {
int l = read(), r = read(), a = read();
ra[i] = { l, r, a };
}
for (int i = 1; i <= n; ++i) q[i] = i;
solve(1, k + 1, q, n);
for (int i = 1; i <= n; ++i)
if (ans[i] != k + 1)
cout << ans[i] << '\n';
else cout << "NIE\n";
return 0;
}