제출 #401514

#제출 시각아이디문제언어결과실행 시간메모리
401514raidXORanges (eJOI19_xoranges)C++17
100 / 100
657 ms13420 KiB
#include <iostream> using namespace std; const int MAXN = 200002; int v[MAXN], n; struct segtree { int tree[4 * MAXN], m; void init( int dim ) { for ( int i = 0; i <= 4 * n; ++i ) { this -> tree[i] = 0; } this -> m = dim; } void update( int node, int l, int r, int x, int pos ) { if ( l == r ) { this -> tree[node] = x; return; } int mid = (l + r) / 2; if ( pos <= mid ) { update( 2 * node, l, mid, x, pos ); } else { update( 2 * node + 1, mid + 1, r, x, pos ); } this -> tree[node] = this -> tree[2 * node] ^ this -> tree[2 * node + 1]; } int query( int node, int l, int r, int x, int y ) { int a = 0, b = 0; if ( x <= l && r <= y ) { return this -> tree[node]; } int mid = (l + r) / 2; if ( x <= mid ) { a = query( 2 * node, l, mid, x, y ); } if ( y > mid ) { b = query( 2 * node + 1, mid + 1, r, x, y ); } return a ^ b; } void update( int x, int pos ) { update( 1, 1, m, x, pos ); } int query( int x, int y ) { return query( 1, 1, m, x, y ); } }; int main() { int q, t, x, y; segtree odd, even; cin >> n >> q; for ( int i = 1; i <= n; ++i ) { cin >> v[i]; } odd.init( ((n + 1) >> 1) ); even.init( (n >> 1) ); for ( int i = 1; i <= n; ++i ) { if ( i & 1 ) { odd.update( v[i], (i >> 1) + 1 ); } else { even.update( v[i], (i >> 1) ); } } while ( q-- ) { cin >> t >> x >> y; if ( t == 1 ) { if ( x & 1 ) { odd.update( y, (x >> 1) + 1 ); } else { even.update( y, (x >> 1) ); } } else { if ( (y - x + 1) & 1 ) { if ( x & 1 ) { cout << odd.query( (x >> 1) + 1, (y >> 1) + 1 ) << "\n"; } else { cout << even.query( (x >> 1), (y >> 1) ) << "\n"; } } else { cout << "0\n"; } } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...