可以考虑将修改倒序操作,这样就将问题转化为了序列中赋值并删数的操作。这个操作就可以拿链表来维护。
可以使用并查集维护的链表做,它特别擅长做仅删除的链表问题,并且复杂度是O(N)而不是传统的带log的,非常优秀。
#include <bits/stdc++.h>
// #define int long long
using namespace std;
#define ll long long
const int N = 1.5e7, M = 2e5;
const ll MOD = 100000009;
int n, m;
int fa[N], val[N];
int l[M], r[M];
int find(int x) {
return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
signed main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &l[i], &r[i]);
}
for (int i = 0; i <= n; i++) {
fa[i] = i;
}
for (int i = 0; i <= n; i++) {
val[i] = 0;
}
for (int i = m; i >= 1; i--) {
int j = find(l[i]);
while (j <= r[i]) {
int nxt = find(j + 1);
if (val[j] == 0) {
val[j] = i;
fa[j] = nxt;
}
j = nxt;
}
}
ll ans = 0;
for (int i = 0; i < n; i++) {
ans += ((long long)i * val[i]) % MOD;
ans %= MOD;
}
printf("%lld", ans);
return 0;
}