01-10 14:41
Recent Posts
Recent Comments
관리 메뉴

너와나의 관심사

백준 14245 XOR 문제 본문

카테고리 없음

백준 14245 XOR 문제

벤치마킹 2019. 6. 3. 01:26

SegmentTree 문제로 

각각 부모 노드에 xor 연산을 .. update 해가고 정답을 구할때 xor 연산을 부모 까지 하는것..




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdio.h>
#include <iostream>
#include <memory.h>
 
 
using namespace std;
 
typedef long long ll;
int N, M, K;
int TN =1;
 
// n 명일때 m 개의 그룹에서 자기자신이 포함된것과 안된것 
 
ll num[1000001];
ll tree[3000001];
 
 
//query l, query r, idx, l, r//
ll calc(int ql, int qr, int idx, int l, int r, int val){
 
 
    if (ql <= l &&  r <= qr) return tree[idx] ^= val;
    if (r < ql || l > qr) return 0;
 
 
    ll lnode = calc(ql, qr, idx * 2, l, (l + r) / 2,  val);
    ll rnode = calc(ql, qr, idx * 2 + 1, (l + r) / 2 + 1, r, val);
 
    return lnode + rnode;
}
 
 
int main()
{
 
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    freopen("input.txt""r", stdin); setbuf(stdout, NULL);
 
    cin >> N;
 
    while (TN < N){
 
        TN <<= 1;
 
    }
 
    for (int i = 1; i <= N; i++)
    {
        cin >> num[i];
        tree[TN + i - 1= num[i];
    }
 
 
    //나머지 채우기 //
    for (int i = TN + N; i < TN * 2; i++)
        tree[i] = 0;
 
 
    cin >> M;
 
    while (M--){
        int a, b, c, d;
 
        cin >> a >> b;
        if (a == 1)
        {
            cin >> c >> d;
 
            b++;
            c++;
            calc(b, c, 11, TN, d);
 
        }
        else{
 
            b++;
            int idx = TN + b - 1;
            int val = tree[idx];
            idx >>= 1;
 
            while (idx>0){
 
                val  ^= tree[idx];
                idx >>= 1;
            }
 
            cout << val << "\n";
        }
    }
 
    return 0;
}
 
cs


Comments