結果
| 問題 |
No.3094 Stapler
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-03-05 13:32:18 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 264 ms / 2,000 ms |
| コード長 | 3,423 bytes |
| コンパイル時間 | 7,055 ms |
| コンパイル使用メモリ | 354,100 KB |
| 実行使用メモリ | 17,124 KB |
| 最終ジャッジ日時 | 2025-10-23 22:19:08 |
| 合計ジャッジ時間 | 17,956 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 72 |
ソースコード
#include "atcoder/segtree.hpp"
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using pll = pair<ll, ll>;
using pii = pair<int, int>;
using mint = modint998244353;
constexpr ll mod = 998244353;
using MINT = modint1000000007;
constexpr ll MOD = 1000000007;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
template <typename T> void print(vector<T> A);
int main()
{
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int N;
cin >> N;
int Q;
cin >> Q;
ll sum = 0;
map<int, pii> queries;
int block_size = 316;
vector<int> Paper(N);
vector<int> block_covered(N);
vector<int> block_ans(N);
for (int i = 0; i < N; i++) {
block_ans[i/block_size]++;
}
for (int i = 0; i < Q; i++) {
int t;
cin >> t;
if (t == 1) {
int l, r;
cin >> l >> r;
l--;
r--;
queries[i]=make_pair(l,r);
int lb = l / block_size, rb = r / block_size;
if (lb == rb) {
for (int j = l; j < r; j++) {
if (Paper[j] == 0) {
block_ans[lb]--;
}
Paper[j]++;
}
continue;
}
for (int j = l; j < (lb + 1) * block_size; j++) {
if (Paper[j] == 0) {
block_ans[lb]--;
}
Paper[j]++;
}
for (int j = rb * block_size; j < r; j++) {
if (Paper[j] == 0) {
block_ans[rb]--;
}
Paper[j]++;
}
for (int b = lb + 1; b < rb; b++) {
block_covered[b]++;
}
} else if (t == 2) {
int q;
cin >> q;
q--;
auto [l, r] = queries[q];
int lb = l / block_size, rb = r / block_size;
if (lb == rb) {
for (int j = l; j < r; j++) {
if (Paper[j] == 1) {
block_ans[lb]++;
}
Paper[j]--;
}
continue;
}
for (int j = l; j < (lb + 1) * block_size; j++) {
if (Paper[j] == 1) {
block_ans[lb]++;
}
Paper[j]--;
}
for (int j = rb * block_size; j < r; j++) {
if (Paper[j] == 1) {
block_ans[rb]++;
}
Paper[j]--;
}
for (int b = lb + 1; b < rb; b++) {
block_covered[b]--;
}
} else {
int ans=0;
for (int b = 0; b <= N; b++) {
if (b * block_size > N) {
break;
}
if (block_covered[b]) {
continue;
}
ans+=block_ans[b];
}
cout<<ans<<endl;
}
//print(block_ans);
}
}
template <typename T>
void print(vector<T> A)
{
for (int i = 0; i < A.size() - 1; i++)
{
cout << A[i] << ' ';
}
cout << A[A.size() - 1] << endl;
return;
}