結果
| 問題 |
No.879 Range Mod 2 Query
|
| コンテスト | |
| ユーザー |
leaf_1415
|
| 提出日時 | 2019-09-06 23:04:21 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 254 ms / 3,000 ms |
| コード長 | 2,612 bytes |
| コンパイル時間 | 713 ms |
| コンパイル使用メモリ | 66,844 KB |
| 実行使用メモリ | 12,160 KB |
| 最終ジャッジ日時 | 2024-06-24 22:20:10 |
| 合計ジャッジ時間 | 4,409 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 21 |
ソースコード
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#define llint long long
#define inf 1e18
using namespace std;
typedef pair<llint, llint> P;
typedef pair<llint, P> T;
void calc(llint &s, llint &s2, llint &t, llint &t2)
{
if(s == 0){
t2 += s2;
return;
}
llint x = 1;
if(t == -1) x = -1;
if(t2 % 2) x *= -1;
x *= s;
t = x, t2 = s2;
}
struct SegTree{
int size;
vector<llint> seg, seg2, delay, delay2;
SegTree(){}
SegTree(int size){
this->size = size;
seg.resize(1<<(size+1));
seg2.resize(1<<(size+1));
delay.resize(1<<(size+1));
delay2.resize(1<<(size+1));
}
void init()
{
for(int i = 0; i < (1<<(size+1)); i++){
seg[i] = 0, seg2[i] = 0;
delay[i] = 0, delay2[i] = 0;
}
}
void eval(int l, int r, int k)
{
if(delay[k]){
if(delay[k] == -1) seg2[k] = (r-l+1) - seg2[k];
seg[k] = seg2[k];
}
if(delay2[k]){
seg[k] += delay2[k] * (r-l+1);
if(delay2[k] % 2) seg2[k] = (r-l+1) - seg2[k];
}
if(delay[k] || delay2[k]){
if(l < r){
calc(delay[k], delay2[k], delay[k*2], delay2[k*2]);
calc(delay[k], delay2[k], delay[k*2+1], delay2[k*2+1]);
}
delay[k] = delay2[k] = 0;
}
}
void add(int a, int b, int k, int l, int r, llint val, llint val2)
{
eval(l, r, k);
if(b < l || r < a) return;
if(a <= l && r <= b){
calc(val, val2, delay[k], delay2[k]);
//delay[k] = val, delay2[k] = val2;
eval(l, r, k);
return;
}
add(a, b, k*2, l, (l+r)/2, val, val2);
add(a, b, k*2+1, (l+r)/2+1, r, val, val2);
seg[k] = seg[k*2] + seg[k*2+1];
seg2[k] = seg2[k*2] + seg2[k*2+1];
}
void add(int a, int b, llint val, llint val2){
if(a > b) return;
add(a, b, 1, 0, (1<<size)-1, val, val2);
}
llint query(int a, int b, int k, int l, int r)
{
eval(l, r, k);
if(b < l || r < a) return 0;
if(a <= l && r <= b) return seg[k];
llint lval = query(a, b, k*2, l, (l+r)/2);
llint rval = query(a, b, k*2+1, (l+r)/2+1, r);
return lval + rval;
}
llint query(int a, int b)
{
return query(a, b, 1, 0, (1<<size)-1);
}
};
llint n, Q;
llint a[100005];
SegTree seg(17);
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
seg.init();
cin >> n >> Q;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) seg.add(i, i, 0, a[i]);
llint t, l, r, x;
for(int q = 1; q <= Q; q++){
cin >> t >> l >> r;
if(t == 1){
seg.add(l, r, 1, 0);
}
if(t == 2){
cin >> x;
seg.add(l, r, 0, x);
}
if(t == 3){
cout << seg.query(l, r) << "\n";
}
//for(int i = 1; i <= n; i++) cout << seg.query(i, i) << " "; cout << endl;
}
flush(cout);
return 0;
}
leaf_1415