제출 #958686

#제출 시각아이디문제언어결과실행 시간메모리
958686M_SH_OXORanges (eJOI19_xoranges)C++14
100 / 100
473 ms18064 KiB
#pragma GCC optimize("O3") #pragma GCC optimization("Ofast,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include<bits/stdc++.h> #define ll long long #define dou long double #define str string #define pb push_back #define fr first #define se second #define vll vector<ll> #define vpll vector<pair<ll, ll>> #define pll pair<ll, ll> #define endl "\n" using namespace std; ll n; ll a[200000]; ll tree[800008]; ll tree1[800008]; void build_tree1(int v, int tl, int tr) { if (tl == tr) { if(tl % 2 == 1) tree1[v] = a[tl]; else tree1[v] = 0; } else { int tm = (tl + tr) / 2; build_tree1(v * 2, tl, tm); build_tree1(v * 2 + 1, tm + 1, tr); tree1[v] = tree1[v * 2] ^ tree1[v * 2 + 1]; } } int get_sum1(int l, int r, int v, int tl, int tr) { if (l <= tl && tr <= r) { return tree1[v]; } if (tr < l || r < tl) { return 0; } int tm = (tl + tr) / 2; ll k = get_sum1(l, r, v * 2, tl, tm) ^ get_sum1(l, r, v * 2 + 1, tm + 1, tr); return k; } void build_tree(int v, int tl, int tr) { if (tl == tr) { if(tl % 2 == 0) tree[v] = a[tl]; else tree[v] = 0; } else { int tm = (tl + tr) / 2; build_tree(v * 2, tl, tm); build_tree(v * 2 + 1, tm + 1, tr); tree[v] = tree[v * 2] ^ tree[v * 2 + 1]; } } int get_sum(int l, int r, int v, int tl, int tr) { if (l <= tl && tr <= r) { return tree[v]; } if (tr < l || r < tl) { return 0; } int tm = (tl + tr) / 2; ll k = get_sum(l, r, v * 2, tl, tm) ^ get_sum(l, r, v * 2 + 1, tm + 1, tr); return k; } void update(int idx, int val, int v, int tl, int tr) { if (tl == tr) { a[idx] = val; if(idx % 2 == 0) tree[v] = val; else tree1[v] = val; return; } int tm = (tl + tr) / 2; if(idx <= tm) update(idx, val, v * 2, tl, tm); else update(idx, val, v * 2 + 1, tm + 1, tr); tree[v] = tree[v * 2] ^ tree[v * 2 + 1]; tree1[v] = tree1[v * 2] ^ tree1[v * 2 + 1]; } int main() { ll n, q, k, x, l, r; cin >> n >> q; for(int i = 0; i < n; i ++) { cin >> a[i]; } build_tree(1, 0, n-1); build_tree1(1, 0, n-1); for(; q > 0; q --) { cin >> x >> l >> r; if(x == 1) { update(l-1, r, 1, 0, n-1); } else { k = 0; if((r-l+1) % 2 == 1) { if(l % 2 == 1) k = get_sum(l-1, r-1, 1, 0, n-1); else k = get_sum1(l-1, r-1, 1, 0, n-1); //cout << "!!!" << endl; } cout << k << endl; } } }

컴파일 시 표준 에러 (stderr) 메시지

xoranges.cpp:2: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    2 | #pragma GCC optimization("Ofast,unroll-loops")
      |
#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...