提出 #55041993
ソースコード 拡げる
#line 1 "../atcoder/abc255/ex/main.cpp"
#include <atcoder/modint>
#include <iostream>
#line 2 "datastructure/range_map.hpp"
#include <map>
#include <vector>
template <typename T, typename S>
struct range_map {
public:
range_map(bool merge_adjacent = true) : _merge_adjacent(merge_adjacent) {
}
typename std::map<T, std::pair<T, S>>::const_iterator get(T p) const {
auto it = values.upper_bound(p);
if (it == values.begin()) return values.end();
if (std::prev(it)->second.first < p) return values.end();
return std::prev(it);
}
typename std::map<T, std::pair<T, S>>::const_iterator get(
std::pair<T, T> range) const {
auto [l, r] = range;
auto it = get(l);
if (it == values.end()) return values.end();
if (it->second.first < r) return values.end();
return it;
}
void set(std::pair<T, T> range, S x) {
set(range, x, [](T, T, S) {}, [](T, T, S) {});
}
template <class op_insert, class op_erase>
void set(std::pair<T, T> range, S x, const op_insert &f,
const op_erase &g) {
auto [l, r] = range;
auto it_l = values.upper_bound(l);
if (it_l != values.begin() &&
l - T(_merge_adjacent) <= std::prev(it_l)->second.first) {
it_l--;
}
auto it_r = values.upper_bound(r + T(_merge_adjacent));
std::vector<std::tuple<T, T, S>> restore;
restore.reserve(3);
if (it_l != values.end() && it_l->first < l) {
if (it_l->second.second != x) {
restore.emplace_back(it_l->first, l - 1, it_l->second.second);
} else {
l = it_l->first;
}
}
if (it_l != it_r && r < std::prev(it_r)->second.first) {
if (std::prev(it_r)->second.second != x) {
restore.emplace_back(r + 1, std::prev(it_r)->second.first,
std::prev(it_r)->second.second);
} else {
r = std::prev(it_r)->second.first;
}
}
restore.emplace_back(l, r, x);
for (auto it = it_l; it != it_r; it = values.erase(it)) {
g(it->first, it->second.first, it->second.second);
}
for (auto [l, r, x] : restore) {
values[l] = {r, x};
f(l, r, x);
}
}
typename std::map<std::pair<T, T>, S>::const_iterator begin() const {
return values.begin();
}
typename std::map<std::pair<T, T>, S>::const_iterator end() const {
return values.end();
}
protected:
std::map<T, std::pair<T, S>> values;
bool _merge_adjacent;
};
#line 5 "../atcoder/abc255/ex/main.cpp"
using mint = atcoder::modint998244353;
int main() {
long long n;
int q;
std::cin >> n >> q;
range_map<long long, long long> mp;
mp.set({0, n}, 0);
while (q--) {
long long d, l, r;
std::cin >> d >> l >> r;
mint ans = 0;
mp.set(
{l, r}, d,
[&](long long l, long long r, long long x) {
ans -= mint(r - l + 1) * (r + l) / 2 * (d - x);
},
[&](long long l, long long r, long long x) {
ans += mint(r - l + 1) * (r + l) / 2 * (d - x);
});
std::cout << ans.val() << '\n';
}
}
提出情報
ジャッジ結果
セット名 |
Sample |
All |
得点 / 配点 |
0 / 0 |
600 / 600 |
結果 |
|
|
セット名 |
テストケース |
Sample |
example0.txt, example1.txt |
All |
000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, example0.txt, example1.txt |
ケース名 |
結果 |
実行時間 |
メモリ |
000.txt |
AC |
1 ms |
3476 KiB |
001.txt |
AC |
496 ms |
3504 KiB |
002.txt |
AC |
1 ms |
3472 KiB |
003.txt |
AC |
427 ms |
3468 KiB |
004.txt |
AC |
537 ms |
3532 KiB |
005.txt |
AC |
686 ms |
28664 KiB |
006.txt |
AC |
683 ms |
15984 KiB |
007.txt |
AC |
579 ms |
3408 KiB |
008.txt |
AC |
692 ms |
28604 KiB |
009.txt |
AC |
835 ms |
28532 KiB |
010.txt |
AC |
368 ms |
3484 KiB |
011.txt |
AC |
203 ms |
3488 KiB |
012.txt |
AC |
586 ms |
3532 KiB |
013.txt |
AC |
531 ms |
3608 KiB |
014.txt |
AC |
560 ms |
3476 KiB |
015.txt |
AC |
4 ms |
3520 KiB |
016.txt |
AC |
232 ms |
3520 KiB |
017.txt |
AC |
167 ms |
3472 KiB |
018.txt |
AC |
530 ms |
3612 KiB |
019.txt |
AC |
504 ms |
3472 KiB |
020.txt |
AC |
624 ms |
3524 KiB |
021.txt |
AC |
627 ms |
3580 KiB |
022.txt |
AC |
624 ms |
3540 KiB |
023.txt |
AC |
624 ms |
3476 KiB |
024.txt |
AC |
624 ms |
3492 KiB |
025.txt |
AC |
620 ms |
3448 KiB |
026.txt |
AC |
635 ms |
3488 KiB |
027.txt |
AC |
626 ms |
3532 KiB |
028.txt |
AC |
624 ms |
3480 KiB |
029.txt |
AC |
633 ms |
3616 KiB |
030.txt |
AC |
630 ms |
3576 KiB |
031.txt |
AC |
631 ms |
3668 KiB |
032.txt |
AC |
629 ms |
3480 KiB |
033.txt |
AC |
625 ms |
3480 KiB |
034.txt |
AC |
624 ms |
3512 KiB |
035.txt |
AC |
621 ms |
3480 KiB |
example0.txt |
AC |
2 ms |
3536 KiB |
example1.txt |
AC |
1 ms |
3408 KiB |