forked from chr4ss1/SPOJ
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathANDROUND.cpp
More file actions
110 lines (83 loc) · 1.84 KB
/
ANDROUND.cpp
File metadata and controls
110 lines (83 loc) · 1.84 KB
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// RELATED TO PROB
#define MAX_ELEMENTS 22000 + 1
#define MAX_NODES 88004
int T, N, K;
int NODES[MAX_NODES];
bool LAZY[MAX_NODES] = {0};
int A[MAX_ELEMENTS];
int get_next(int *arr, int pos);
int get_prev(int *arr, int pos);
inline void combine(int index)
{
NODES[index] = NODES[2*index] & NODES[2*index+1];
}
void build(int index, int low, int high)
{
if(low == high){
NODES[index] = A[low];
return;
}
int mid = (low + high) >> 1;
int f1 = index << 1;
int f2 = f1 + 1;
build(f1, low, mid);
build(f2, mid+1, high);
combine(index);
}
int query(int index, int r1, int r2, int low, int high)
{
if(r1 > high || r2 < low) return -1;
if(low >= r1 && high <= r2) return NODES[index];
int mid = (low + high) >> 1;
int f1 = index << 1;
int f2 = f1 + 1;
int q1 = query(f1, r1, r2, low, mid);
if(!q1) return 0;
int q2 = query(f2, r1, r2, mid+1, high);
if(!q2) return 0;
if(q1 == -1) return q2;
if(q2 == -1) return q1;
return q1 & q2;
}
int main()
{
parse_data();
T = extract_int();
while(T--){
N = extract_int();
K = extract_int();
for(int i = 1; i <= N; i++)
A[i] = extract_int();
for(int m = 1; m < MAX_NODES; m++)
NODES[m] = 0;
if(K >= N)
K = N - 1;
build(1, 1, N);
for(int i = 1; i <= N; i++){
if(i > 1) printf(" ");
// break number into three segments possibly.
int ls1 = i - K;
int rs1 = i + K;
// easy case, only two segments.
if(ls1 >= 1 && rs1 <= N){
printf("%d", query(1, ls1, rs1, 1, N));
continue;
}
if(ls1 < 1 && rs1 > N){
printf("%d", query(1, 1, N, 1, N));
continue;
}
if(ls1 < 1){
int we = query(1, 1, rs1, 1, N);
int wx = query(1, N - (ls1*-1), N, 1, N);
printf("%d", we & wx);
continue;
}
int we = query(1, ls1, N, 1, N);
int wx = query(1, 1, rs1 - N, 1, N);
printf("%d", we & wx);
}
printf("\n");
}
return 0;
}