#include <bits/stdc++.h>
using namespace std;
struct Node{
int l, r;
set<int> f, fcan;
int can, p;
};
int N, M;
bool ans[100005];
pair<int, int> arr[100005];
int xo[100005], xx[100005], yo[100005], yx[100005];
vector<int> cmp;
Node seg[600005];
int getidx(int n){
return lower_bound(cmp.begin(), cmp.end(), n) - cmp.begin() + 1;
}
void build(int l, int r, int idx){
seg[idx].can = N+1;
seg[idx].l = l, seg[idx].r = r;
if(l == r){
return;
}
int mid = l+r>>1;
build(l, mid, 2*idx);
build(mid+1, r, 2*idx+1);
}
void pu(int idx){
seg[idx].p = 0;
seg[idx].can = N+1;
if(seg[idx].l != seg[idx].r){
seg[idx].p = max(seg[2*idx].p, seg[2*idx+1].p);
seg[idx].can = min(seg[2*idx].can, seg[2*idx+1].can);
}
seg[idx].p = max(seg[idx].f.size() ? *(--seg[idx].f.end()) : 0, seg[idx].p);
seg[idx].can = min(seg[idx].fcan.size() ? *(seg[idx].fcan.begin()) : N+1, seg[idx].can);
}
void remc(int l, int r, int v, int idx){
if(seg[idx].l == l && seg[idx].r == r){
seg[idx].fcan.erase(v);
pu(idx);
return;
}
int mid = seg[idx].l + seg[idx].r >> 1;
if(r <= mid){
remc(l, r, v, 2*idx);
}
else if(l > mid){
remc(l, r, v, 2*idx+1);
}
else{
remc(l, mid, v, 2*idx);
remc(mid+1, r, v, 2*idx+1);
}
pu(idx);
}
void add(int l, int r, int v, int idx){
//cout << l << " " << r << " " << v << endl;
if(seg[idx].f.size() && *(--seg[idx].f.end()) > v){
ans[v] = 1;
}
while(seg[idx].fcan.size() && *seg[idx].fcan.begin() < v){
int n = *seg[idx].fcan.begin();
remc(yo[n], yx[n], n, 1);
ans[n] = 1;
}
if(seg[idx].l == l && seg[idx].r == r){
seg[idx].f.insert(v);
seg[idx].fcan.insert(v);
//cout << *seg[idx].can.begin() << endl;
while(seg[idx].can < v){
ans[seg[idx].can] = 1;
remc(yo[seg[idx].can], yx[seg[idx].can], seg[idx].can, 1);
}
if(seg[idx].p > v){
ans[v] = 1;
}
pu(idx);
return;
}
int mid = seg[idx].l + seg[idx].r >> 1;
if(r <= mid){
add(l, r, v, 2*idx);
}
else if(l > mid){
add(l, r, v, 2*idx+1);
}
else{
add(l, mid, v, 2*idx);
add(mid+1, r, v, 2*idx+1);
}
pu(idx);
}
void rem(int l, int r, int v, int idx){
if(seg[idx].l == l && seg[idx].r == r){
assert(seg[idx].f.erase(v));
if(seg[idx].fcan.count(v)){
seg[idx].fcan.erase(v);
}
pu(idx);
return;
}
int mid = seg[idx].l + seg[idx].r >> 1;
if(r <= mid){
rem(l, r, v, 2*idx);
}
else if(l > mid){
rem(l, r, v, 2*idx+1);
}
else{
rem(l, mid, v, 2*idx);
rem(mid+1, r, v, 2*idx+1);
}
pu(idx);
}
int main(){
cin.sync_with_stdio(0);
cin.tie(0);
cin >> N;
for(int i = 1; i<=N; i++){
cin >> xo[i] >> yo[i] >> xx[i] >> yx[i];
xx[i] += xo[i];
yx[i] += yo[i];
yx[i]--;
cmp.push_back(yo[i]);
cmp.push_back(yx[i]);
}
sort(cmp.begin(), cmp.end());
cmp.erase(unique(cmp.begin(), cmp.end()), cmp.end());
M = cmp.size();
build(1, M, 1);
for(int i = 1; i<=N; i++){
yo[i] = getidx(yo[i]), yx[i] = getidx(yx[i]);
arr[i].first = xo[i];
arr[i+N].first = xx[i];
arr[i].second = i;
arr[i+N].second = -i;
}
sort(arr+1, arr+1+2*N);
for(int n = 1; n<=2*N; n++){
if(arr[n].second > 0){
add(yo[arr[n].second], yx[arr[n].second], arr[n].second, 1);
}
else{
rem(yo[-arr[n].second], yx[-arr[n].second], -arr[n].second, 1);
}
}
for(int i = 1; i<=N; i++){
if(ans[i]){
cout << "NE\n";
}
else{
cout << "DA\n";
}
}
}
/*
5
1 1 20 20
1 1 1 1
1 2 1 1
1 2 2 2
1 1 10 10
3
1 1 2 2
1 4 2 2
3 2 5 5
*/
Compilation message
suncanje.cpp: In function 'void build(int, int, int)':
suncanje.cpp:28:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int mid = l+r>>1;
~^~
suncanje.cpp: In function 'void remc(int, int, int, int)':
suncanje.cpp:50:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int mid = seg[idx].l + seg[idx].r >> 1;
~~~~~~~~~~~^~~~~~~~~~~~
suncanje.cpp: In function 'void add(int, int, int, int)':
suncanje.cpp:88:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int mid = seg[idx].l + seg[idx].r >> 1;
~~~~~~~~~~~^~~~~~~~~~~~
suncanje.cpp: In function 'void rem(int, int, int, int)':
suncanje.cpp:111:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int mid = seg[idx].l + seg[idx].r >> 1;
~~~~~~~~~~~^~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
76 ms |
66680 KB |
Output is correct |
2 |
Correct |
82 ms |
66808 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
112 ms |
67192 KB |
Output is correct |
2 |
Correct |
237 ms |
69620 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
172 ms |
68088 KB |
Output is correct |
2 |
Runtime error |
351 ms |
140088 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
220 ms |
68868 KB |
Output is correct |
2 |
Correct |
236 ms |
69748 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
320 ms |
70236 KB |
Output is correct |
2 |
Runtime error |
220 ms |
140320 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
415 ms |
140504 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
251 ms |
69888 KB |
Output is correct |
2 |
Runtime error |
216 ms |
140668 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
221 ms |
139924 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
228 ms |
139812 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
244 ms |
140136 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |