#include <bits/stdc++.h>
using namespace std;
struct node{
int s,e;
int minv,maxv;
node *l,*r;
node (int _s, int _e){
s = _s; e = _e;
if (s!=e){
l = new node(s,(s+e)/2);
r = new node((s+e)/2+1,e);
}
minv = 999999999;
maxv = -1;
}
void upd(int pos, int val){
minv = min(minv,val);
maxv = max(maxv,val);
if (s==e) return;
if (pos<=(s+e)/2) l->upd(pos,val);
else r->upd(pos,val);
}
int querymin(int a, int b){
if (a<=s && e<=b){
return minv;
}
else if (b<=(s+e)/2) return l->querymin(a,b);
else if (a>(s+e)/2) return r->querymin(a,b);
else return min(l->querymin(a,b),r->querymin(a,b));
}
int querymax(int a, int b){
if (a<=s && e<=b){
return maxv;
}
else if (b<=(s+e)/2) return l->querymax(a,b);
else if (a>(s+e)/2) return r->querymax(a,b);
else return max(l->querymax(a,b),r->querymax(a,b));
}
int rightblock(int minpos, int val){
// printf("call rightblock %d %d on %d %d\n",minpos,val,s,e);
if (s==e){
return minv<val?s:999999999;
}
if (minpos==s){
if (l->minv<val) return l->rightblock(minpos,val);
else return r->rightblock((s+e)/2+1,val);
}
if (minpos>(s+e)/2){
return r->rightblock(minpos,val);
}
int t = l->rightblock(minpos,val);
if (t==999999999){
return r->rightblock((s+e)/2+1,val);
}
else return t;
}
int leftblock(int maxpos, int val){
if (s==e){
return maxv>val?s:-1;
}
if (maxpos==e){
if (r->maxv>val) return r->leftblock(maxpos,val);
else return l->leftblock(maxpos,val);
}
if (maxpos<=(s+e)/2) return l->leftblock(maxpos,val);
int t = r->leftblock(maxpos,val);
if (t==-1) return l->leftblock(maxpos,val);
else return t;
}
}*root1,*root2;
int walltype[500005];
vector<int> keys[500005];
int intervall[500005];
int intervalr[500005];
int walll[500005];
int wallr[500005];
map<int,int> tempmap;
void rec(int l, int r, vector<int> &thing){
vector<pair<int,int> > stuff;
for (int x = l; x<=r; x++){
stuff.push_back({-(x&-x),x});
}
sort(stuff.begin(),stuff.end());
for (auto x : stuff){
thing.push_back(x.second);
}
}
int main(){
int n;
scanf("%d",&n);
root1 = new node(0,n+1);
root2 = new node(0,n+1);
for (int x = 1; x<n; x++){
scanf("%d",&walltype[x]);
}
for (int x = 1; x<=n; x++){
int t;
scanf("%d",&t);
for (int y = 0; y<t; y++){
int a;
scanf("%d",&a);
keys[x].push_back(a);
}
}
for (int x = 1; x<n; x++){
for (auto y : keys[x]){
tempmap[y] = x;
}
walll[x] = tempmap[walltype[x]];
}
tempmap.clear();
for (int x = n-1; x>0; x--){
for (auto y : keys[x+1]){
tempmap[y] = x+1;
}
if (tempmap.count(walltype[x])) wallr[x] = tempmap[walltype[x]];
else wallr[x] = n+1;
}
for (int x = 1; x<n; x++){
root1->upd(x,walll[x]);
root1->upd(x,wallr[x]);
}
vector<int> order;
rec(1,n,order);
// printf("wall preproc done\n");
for (int x : order){
int curl = x;
int curr = x;
while (true){
// printf("curl,curr = %d %d\n",curl,curr);
int newr = root1->rightblock(curr,curl);
newr = min(newr,n);
// printf("rightblock %d %d = %d\n",curr,curl,newr);
int newl = root1->leftblock(curl-1,newr)+1;
newl = max(newl,1);
//printf("leftblock %d %d = %d\n",curl-1,curr,newl);
if (newl==curl&& newr==curr) {
intervall[x] = curl;
intervalr[x] = curr;
break;
}
if (newl<curl){
int te = root2->querymax(newl,x-1);
if (te>=x){
intervalr[x] = te;
intervall[x] = root2->querymin(newl,x-1);
break;
}
}
if (newr>curr){
int te = root2->querymin(x+1,newr);
if (te<=x){
intervall[x] = te;
intervalr[x] = root2->querymax(x+1,newr);
break;
}
}
curl = newl;
curr = newr;
}
root2->upd(x,intervalr[x]);
root2->upd(x,intervall[x]);
// printf("interval[%d] = %d %d\n",x,intervall[x],intervalr[x]);
}
int q;
scanf("%d",&q);
for (int x = 0; x<q; x++){
int a,b;
scanf("%d%d",&a,&b);
if (b<=intervalr[a] && b>=intervall[a]){
printf("YES\n");
}
else{
printf("NO\n");
}
}
}
Compilation message
long_mansion.cpp: In function 'int main()':
long_mansion.cpp:97:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
97 | scanf("%d",&n);
| ~~~~~^~~~~~~~~
long_mansion.cpp:101:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
101 | scanf("%d",&walltype[x]);
| ~~~~~^~~~~~~~~~~~~~~~~~~
long_mansion.cpp:105:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
105 | scanf("%d",&t);
| ~~~~~^~~~~~~~~
long_mansion.cpp:108:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
108 | scanf("%d",&a);
| ~~~~~^~~~~~~~~
long_mansion.cpp:173:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
173 | scanf("%d",&q);
| ~~~~~^~~~~~~~~
long_mansion.cpp:176:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
176 | scanf("%d%d",&a,&b);
| ~~~~~^~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
12492 KB |
Output is correct |
2 |
Correct |
23 ms |
12856 KB |
Output is correct |
3 |
Correct |
62 ms |
13364 KB |
Output is correct |
4 |
Correct |
16 ms |
12600 KB |
Output is correct |
5 |
Correct |
27 ms |
12576 KB |
Output is correct |
6 |
Correct |
16 ms |
12620 KB |
Output is correct |
7 |
Correct |
14 ms |
12620 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
12492 KB |
Output is correct |
2 |
Correct |
23 ms |
12856 KB |
Output is correct |
3 |
Correct |
62 ms |
13364 KB |
Output is correct |
4 |
Correct |
16 ms |
12600 KB |
Output is correct |
5 |
Correct |
27 ms |
12576 KB |
Output is correct |
6 |
Correct |
16 ms |
12620 KB |
Output is correct |
7 |
Correct |
14 ms |
12620 KB |
Output is correct |
8 |
Correct |
150 ms |
14020 KB |
Output is correct |
9 |
Correct |
147 ms |
13984 KB |
Output is correct |
10 |
Correct |
161 ms |
14488 KB |
Output is correct |
11 |
Correct |
224 ms |
15016 KB |
Output is correct |
12 |
Correct |
136 ms |
14080 KB |
Output is correct |
13 |
Correct |
148 ms |
14240 KB |
Output is correct |
14 |
Correct |
146 ms |
14464 KB |
Output is correct |
15 |
Correct |
143 ms |
14308 KB |
Output is correct |
16 |
Correct |
157 ms |
14556 KB |
Output is correct |
17 |
Correct |
147 ms |
14232 KB |
Output is correct |
18 |
Correct |
146 ms |
14240 KB |
Output is correct |
19 |
Correct |
187 ms |
14256 KB |
Output is correct |
20 |
Correct |
147 ms |
14428 KB |
Output is correct |
21 |
Correct |
155 ms |
14468 KB |
Output is correct |
22 |
Correct |
186 ms |
14384 KB |
Output is correct |
23 |
Correct |
166 ms |
14124 KB |
Output is correct |
24 |
Correct |
149 ms |
14192 KB |
Output is correct |
25 |
Correct |
153 ms |
14216 KB |
Output is correct |
26 |
Correct |
147 ms |
14108 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
3018 ms |
37560 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
12492 KB |
Output is correct |
2 |
Correct |
23 ms |
12856 KB |
Output is correct |
3 |
Correct |
62 ms |
13364 KB |
Output is correct |
4 |
Correct |
16 ms |
12600 KB |
Output is correct |
5 |
Correct |
27 ms |
12576 KB |
Output is correct |
6 |
Correct |
16 ms |
12620 KB |
Output is correct |
7 |
Correct |
14 ms |
12620 KB |
Output is correct |
8 |
Correct |
150 ms |
14020 KB |
Output is correct |
9 |
Correct |
147 ms |
13984 KB |
Output is correct |
10 |
Correct |
161 ms |
14488 KB |
Output is correct |
11 |
Correct |
224 ms |
15016 KB |
Output is correct |
12 |
Correct |
136 ms |
14080 KB |
Output is correct |
13 |
Correct |
148 ms |
14240 KB |
Output is correct |
14 |
Correct |
146 ms |
14464 KB |
Output is correct |
15 |
Correct |
143 ms |
14308 KB |
Output is correct |
16 |
Correct |
157 ms |
14556 KB |
Output is correct |
17 |
Correct |
147 ms |
14232 KB |
Output is correct |
18 |
Correct |
146 ms |
14240 KB |
Output is correct |
19 |
Correct |
187 ms |
14256 KB |
Output is correct |
20 |
Correct |
147 ms |
14428 KB |
Output is correct |
21 |
Correct |
155 ms |
14468 KB |
Output is correct |
22 |
Correct |
186 ms |
14384 KB |
Output is correct |
23 |
Correct |
166 ms |
14124 KB |
Output is correct |
24 |
Correct |
149 ms |
14192 KB |
Output is correct |
25 |
Correct |
153 ms |
14216 KB |
Output is correct |
26 |
Correct |
147 ms |
14108 KB |
Output is correct |
27 |
Execution timed out |
3018 ms |
37560 KB |
Time limit exceeded |
28 |
Halted |
0 ms |
0 KB |
- |