Submission #578496

#TimeUsernameProblemLanguageResultExecution timeMemory
578496alireza_kavianiLong Mansion (JOI17_long_mansion)C++17
100 / 100
431 ms72192 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;

#define all(x)      (x).begin(),(x).end()
#define X           first
#define Y           second
#define sep         ' '
#define endl        '\n'
#define SZ(x)       ll(x.size())
#define lc          id << 1
#define rc          lc | 1

const ll MAXN = 1e6 + 10;
const ll LOG = 22;
const ll INF = 8e18;
const ll MOD = 1e9 + 7; //998244353; //1e9 + 9;

int n , q , B[MAXN] , C[MAXN] , last[MAXN] , prv[MAXN] , nxt[MAXN] , L[MAXN] , R[MAXN] , seg[MAXN << 2];
vector<int> A[MAXN];

void build(int id = 1 , int l = 1 , int r = n + 2){
	if(r - l == 1){
		seg[id] = prv[l];
		return;
	}
	int mid = l + r >> 1;
	build(lc , l , mid);
	build(rc , mid , r);
	seg[id] = min(seg[lc] , seg[rc]);
}

int Find(int ql , int qr , int x , int id = 1 , int l = 1 , int r = n + 2){
	if(qr <= l || r <= ql || seg[id] >= x)	return -1;
	if(r - l == 1)	return l;
	int mid = l + r >> 1;
	int res = Find(ql , qr , x , lc , l , mid);
	if(res != -1)	return res;
	return Find(ql , qr , x , rc , mid , r);
}

int main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

	cin >> n;
	for(int i = 1 ; i < n ; i++)	cin >> C[i];
	for(int i = 1 ; i <= n ; i++){
		cin >> B[i];
		for(int j = 0 ; j < B[i] ; j++){
			int x;
			cin >> x;
			A[i].push_back(x);
		}
	}
	for(int i = 1 ; i <= n ; i++){
		prv[i] = last[C[i - 1]];
		for(int j : A[i]){
			last[j] = i;
		}
	}
	fill(last , last + MAXN , n + 1);
	for(int i = n ; i >= 1 ; i--){
		nxt[i] = last[C[i]];
		for(int j : A[i]){
			last[j] = i;
		}
	}
	nxt[0] = n + 1;
	build();
	for(int i = 1 ; i <= n ; i++){
		L[i] = R[i] = i;
		while(1){
			int newR = Find(R[i] + 1, n + 2, L[i]) - 1;
			int newL = (nxt[L[i] - 1] <= newR ? L[L[i] - 1] : L[i]);
			if(newL == L[i] && newR == R[i])	break;
			L[i] = newL;
			R[i] = newR;
		}
	}
	cin >> q;
	while(q--){
		int x , y;
		cin >> x >> y;
		if(L[x] <= y && y <= R[x]){
			cout << "YES" << endl;
		}
		else{
			cout << "NO" << endl;
		}
	}

    return 0;
}
/*

*/

Compilation message (stderr)

long_mansion.cpp: In function 'void build(int, int, int)':
long_mansion.cpp:30:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   30 |  int mid = l + r >> 1;
      |            ~~^~~
long_mansion.cpp: In function 'int Find(int, int, int, int, int, int)':
long_mansion.cpp:39:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   39 |  int mid = l + r >> 1;
      |            ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...