Submission
Status:
PPPPPPPPPPP
Score: 100
User: Dormon
Problemset: เปิดไฟ
Language: cpp
Time: 0.112 second
Submitted On: 2025-01-03 20:33:07
#include <iostream>
#include <cstdint>
#include <cstring>
#include <vector>
#include <algorithm>
#include <functional>
#include <queue>
#include <numeric>
#include <array>
#include <iomanip> // cout << fixed << setprecision(n);
#define debug(...) Debug(#__VA_ARGS__, __VA_ARGS__)
using namespace std;
const bool TEST_CASE = 0;
template<typename T>
typename std::enable_if<std::is_integral<T>::value>::type
Debug(const char* name, T value) {
std::cout << name << " : " << value << '\n';
}
template<typename T, typename... Args>
typename std::enable_if<std::is_integral<T>::value>::type
Debug(const char* names, T value, Args... args) {
const char* comma = strchr(names, ',');
std::cout.write(names, comma - names) << " : " << value << " | ";
Debug(comma + 1, args...);
}
template<typename T> ostream& operator<<(ostream& out, vector<T>& a) {
for(auto &x : a) out << x << ' ';
return out;
};
class LazySegmentTree {
vector<int> tree, lazy;
int n;
void build(int u, int l, int r) {
if (l == r){
tree[u] = 0;
return;
}
int mid = (l + r) / 2;
build(2*u, l, mid);
build(2*u+1, mid+1, r);
tree[u] = tree[2*u] + tree[2*u+1];
}
void pushlz(int u, int l, int r) {
if (lazy[u] % 2 != 0) {
tree[u] = (r - l + 1) - tree[u];
if (l != r) {
lazy[2 * u] += lazy[u];
lazy[2 * u + 1] += lazy[u];
}
}
lazy[u] = 0;
}
void updateRange(int u, int start, int end, int l, int r) {
pushlz(u, start, end);
if (start > r || end < l)
return;
if (start >= l && end <= r){
lazy[u] += 1;
pushlz(u, start, end);
return;
}
int mid = (start + end) / 2;
updateRange(2 * u, start, mid, l, r);
updateRange(2 * u + 1, mid + 1, end, l, r);
tree[u] = tree[2 * u] + tree[2 * u + 1];
}
int queryRange(int u, int start, int end, int l, int r) {
pushlz(u, start, end);
if (start > r || end < l)
return 0;
if (start >= l && end <= r)
return tree[u];
int mid = (start + end) / 2;
return queryRange(2 * u, start, mid, l, r) +
queryRange(2 * u + 1, mid + 1, end, l, r);
}
public:
LazySegmentTree(int size) {
n = size;
tree.resize(4 * n, 0);
lazy.resize(4 * n, 0);
build(1, 1, n);
}
void update(int l, int r) {
updateRange(1, 1, n, l, r);
}
int query(int l, int r) {
return queryRange(1, 1, n, l, r);
}
};
void solve(){
int n, q;
cin >> n >> q;
LazySegmentTree tree(n);
while (q--){
int type, l, r;
cin >> type >> l >> r;
if (type)
cout << tree.query(l, r) << '\n';
else
tree.update(l, r);
}
}
#define DORMON
int main()
{
#ifndef DORMON
ios_base::sync_with_stdio(false);
#endif
cin.tie(0);
int q = 1;
if (TEST_CASE) cin >> q;
while (q--){
solve();
}
}