#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
#define f first
#define s second
#define mp make_pair
int last[500005],L[500005],R[500005];
int c[500005];
vector<int> v[500005];
pii rng[500005];//range...
void aq(){//to be kept for later...
int q,a,b;
cin>>q;
while(q--){
cin>>a>>b;
a--;b--;
if(rng[a].f<=b && b<=rng[a].s){
cout<<"YES\n";
}else cout<<"NO\n";
}
}
int n;
struct st{
int s,e;
int ll,rr;
st *l,*r;
st(int ss,int ee){
s=ss;e=ee;
if(s==e){
l=r=NULL;
ll=L[s];
rr=R[s];
}else{
l=new st(s,(s+e)/2);
r=new st((s+e)/2+1,e);
ll=min(l->ll,r->ll);
rr=max(l->rr,r->rr);
}
}
int lsearch(int start,int limit){
if(start<s)return start;
if(start<e){
int ans=-1;
if((s+e)/2<start){
ans=r->lsearch(start,limit);
if(ans==-1)return l->lsearch(start,limit);
return ans;
}
return l->lsearch(start,limit);
}
//includes whole range:
if(rr<=limit)return -1;
if(s==e)return s;
if(r->rr<=limit)return l->lsearch(start,limit);
else return r->lsearch(start,limit);
}
int rsearch(int start,int limit){
if(e<start)return start;
if(s<start){
int ans=n-1;
if(start<=(s+e)/2){
ans=l->rsearch(start,limit);
if(ans==n-1)return r->rsearch(start,limit);
return ans;
}
return r->rsearch(start,limit);
}
//includes whole range
if(ll>=limit)return n-1;
if(s==e)return s;
if(l->ll>=limit)return r->rsearch(start,limit);
else return l->rsearch(start,limit);
}
} *nx;
struct node{
int mn=1e9,mx=-1;
int s,e;
node *l,*r;
node(int ss,int ee){
s=ss;e=ee;
if(s==e){
l=r=NULL;
}else{
l=new node(s,(s+e)/2);
r=new node((s+e)/2+1,e);
}
}
void upd(int p){
mn=min(mn,rng[p].f);
mx=max(mx,rng[p].s);
if(s==e){
return;
}
if(p<=(s+e)/2)l->upd(p);
else r->upd(p);
}
pii query(int a,int b){
if(a<=s && e<=b)return mp(mn,mx);
pii ans=mp(1e9,-1),tmp;
if(a<=(s+e)/2){
ans=l->query(a,b);
}
if((s+e)/2<b){
tmp=r->query(a,b);
ans.f=min(ans.f,tmp.f);
ans.s=max(ans.s,tmp.s);
}
return ans;
}
} *root;
int32_t main(){
ios_base::sync_with_stdio(false);cin.tie(0);
int a;
cin>>n;
for(int i=0;i+1<n;i++){
cin>>c[i];
}
for(int i=0;i<n;i++){
cin>>a;
v[i].resize(a);
for(int j=0;j<a;j++){
cin>>v[i][j];
}
}
for(int i=1;i<=n;i++){
last[i]=-1;
}
for(int i=0;i+1<n;i++){//L[node]: nearest left node of same key...
for(int x:v[i]){
last[x]=i;
}
L[i]=last[c[i]];
}
for(int i=1;i<=n;i++)last[i]=1e9;
for(int i=n-2;i>=0;i--){
for(int x:v[i+1]){
last[x]=i+1;
}
R[i]=last[c[i]];
}
root=new node(0,n-1);nx=new st(0,n-2);
for(int i=0;i<n;i++){
rng[i].f=rng[i].s=i;
while(true){
pii tmp=rng[i];
// while(rng[i].f>0 && R[rng[i].f-1]<=rng[i].s)rng[i].f--;
rng[i].f=nx->lsearch(rng[i].f-1,rng[i].s)+1;//expand left: first index where R[i]>rng[i].s
rng[i].s=nx->rsearch(rng[i].s,rng[i].f);//expand right: first index where L[i]<rng[i].f
// while(rng[i].s+1<n && L[rng[i].s]>=rng[i].f)rng[i].s++;
if(tmp==rng[i])break;
//fast expansion for hopefully amortized O(n log n)?
tmp=root->query(rng[i].f,i);
rng[i].f=min(rng[i].f,tmp.f);
rng[i].s=max(rng[i].s,tmp.s);
}
root->upd(i);
// cout<<i<<' '<<rng[i].f<<' '<<rng[i].s<<'\t'<<L[i]<<' '<<R[i]<<'\n';
}
aq();
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
12652 KB |
Output is correct |
2 |
Correct |
13 ms |
12876 KB |
Output is correct |
3 |
Correct |
15 ms |
13304 KB |
Output is correct |
4 |
Correct |
12 ms |
12656 KB |
Output is correct |
5 |
Correct |
12 ms |
12552 KB |
Output is correct |
6 |
Correct |
12 ms |
12600 KB |
Output is correct |
7 |
Correct |
12 ms |
12620 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
12652 KB |
Output is correct |
2 |
Correct |
13 ms |
12876 KB |
Output is correct |
3 |
Correct |
15 ms |
13304 KB |
Output is correct |
4 |
Correct |
12 ms |
12656 KB |
Output is correct |
5 |
Correct |
12 ms |
12552 KB |
Output is correct |
6 |
Correct |
12 ms |
12600 KB |
Output is correct |
7 |
Correct |
12 ms |
12620 KB |
Output is correct |
8 |
Correct |
137 ms |
14156 KB |
Output is correct |
9 |
Correct |
124 ms |
14160 KB |
Output is correct |
10 |
Correct |
136 ms |
14556 KB |
Output is correct |
11 |
Correct |
154 ms |
15120 KB |
Output is correct |
12 |
Correct |
129 ms |
14196 KB |
Output is correct |
13 |
Correct |
130 ms |
14460 KB |
Output is correct |
14 |
Correct |
127 ms |
14360 KB |
Output is correct |
15 |
Correct |
132 ms |
14536 KB |
Output is correct |
16 |
Correct |
138 ms |
14672 KB |
Output is correct |
17 |
Correct |
121 ms |
14344 KB |
Output is correct |
18 |
Correct |
129 ms |
14392 KB |
Output is correct |
19 |
Correct |
123 ms |
14440 KB |
Output is correct |
20 |
Correct |
119 ms |
14588 KB |
Output is correct |
21 |
Correct |
147 ms |
14648 KB |
Output is correct |
22 |
Correct |
143 ms |
14476 KB |
Output is correct |
23 |
Correct |
127 ms |
14224 KB |
Output is correct |
24 |
Correct |
139 ms |
14220 KB |
Output is correct |
25 |
Correct |
136 ms |
14276 KB |
Output is correct |
26 |
Correct |
132 ms |
14192 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
268 ms |
38320 KB |
Output is correct |
2 |
Correct |
274 ms |
38036 KB |
Output is correct |
3 |
Correct |
271 ms |
43664 KB |
Output is correct |
4 |
Correct |
260 ms |
45288 KB |
Output is correct |
5 |
Correct |
306 ms |
45248 KB |
Output is correct |
6 |
Correct |
277 ms |
44520 KB |
Output is correct |
7 |
Correct |
265 ms |
44328 KB |
Output is correct |
8 |
Correct |
270 ms |
44296 KB |
Output is correct |
9 |
Correct |
305 ms |
44352 KB |
Output is correct |
10 |
Correct |
314 ms |
44276 KB |
Output is correct |
11 |
Correct |
302 ms |
44316 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
12652 KB |
Output is correct |
2 |
Correct |
13 ms |
12876 KB |
Output is correct |
3 |
Correct |
15 ms |
13304 KB |
Output is correct |
4 |
Correct |
12 ms |
12656 KB |
Output is correct |
5 |
Correct |
12 ms |
12552 KB |
Output is correct |
6 |
Correct |
12 ms |
12600 KB |
Output is correct |
7 |
Correct |
12 ms |
12620 KB |
Output is correct |
8 |
Correct |
137 ms |
14156 KB |
Output is correct |
9 |
Correct |
124 ms |
14160 KB |
Output is correct |
10 |
Correct |
136 ms |
14556 KB |
Output is correct |
11 |
Correct |
154 ms |
15120 KB |
Output is correct |
12 |
Correct |
129 ms |
14196 KB |
Output is correct |
13 |
Correct |
130 ms |
14460 KB |
Output is correct |
14 |
Correct |
127 ms |
14360 KB |
Output is correct |
15 |
Correct |
132 ms |
14536 KB |
Output is correct |
16 |
Correct |
138 ms |
14672 KB |
Output is correct |
17 |
Correct |
121 ms |
14344 KB |
Output is correct |
18 |
Correct |
129 ms |
14392 KB |
Output is correct |
19 |
Correct |
123 ms |
14440 KB |
Output is correct |
20 |
Correct |
119 ms |
14588 KB |
Output is correct |
21 |
Correct |
147 ms |
14648 KB |
Output is correct |
22 |
Correct |
143 ms |
14476 KB |
Output is correct |
23 |
Correct |
127 ms |
14224 KB |
Output is correct |
24 |
Correct |
139 ms |
14220 KB |
Output is correct |
25 |
Correct |
136 ms |
14276 KB |
Output is correct |
26 |
Correct |
132 ms |
14192 KB |
Output is correct |
27 |
Correct |
268 ms |
38320 KB |
Output is correct |
28 |
Correct |
274 ms |
38036 KB |
Output is correct |
29 |
Correct |
271 ms |
43664 KB |
Output is correct |
30 |
Correct |
260 ms |
45288 KB |
Output is correct |
31 |
Correct |
306 ms |
45248 KB |
Output is correct |
32 |
Correct |
277 ms |
44520 KB |
Output is correct |
33 |
Correct |
265 ms |
44328 KB |
Output is correct |
34 |
Correct |
270 ms |
44296 KB |
Output is correct |
35 |
Correct |
305 ms |
44352 KB |
Output is correct |
36 |
Correct |
314 ms |
44276 KB |
Output is correct |
37 |
Correct |
302 ms |
44316 KB |
Output is correct |
38 |
Correct |
551 ms |
122272 KB |
Output is correct |
39 |
Correct |
585 ms |
146220 KB |
Output is correct |
40 |
Correct |
483 ms |
96924 KB |
Output is correct |
41 |
Correct |
723 ms |
144728 KB |
Output is correct |
42 |
Correct |
270 ms |
45524 KB |
Output is correct |
43 |
Correct |
265 ms |
45512 KB |
Output is correct |
44 |
Correct |
419 ms |
72340 KB |
Output is correct |
45 |
Correct |
480 ms |
72620 KB |
Output is correct |
46 |
Correct |
433 ms |
72612 KB |
Output is correct |
47 |
Correct |
252 ms |
45584 KB |
Output is correct |
48 |
Correct |
270 ms |
45332 KB |
Output is correct |
49 |
Correct |
480 ms |
72356 KB |
Output is correct |
50 |
Correct |
604 ms |
72464 KB |
Output is correct |
51 |
Correct |
436 ms |
72708 KB |
Output is correct |
52 |
Correct |
429 ms |
71320 KB |
Output is correct |
53 |
Correct |
589 ms |
97252 KB |
Output is correct |
54 |
Correct |
697 ms |
123236 KB |
Output is correct |
55 |
Correct |
526 ms |
97472 KB |
Output is correct |