Submission #1102463

#TimeUsernameProblemLanguageResultExecution timeMemory
1102463TozzyyyyThrough Another Maze Darkly (CCO21_day1problem3)C++14
0 / 25
15 ms28376 KiB
#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,fma,bmi,bmi2,sse4.2")
#include<bits/stdc++.h>
#define pll pair<long long, long long>
#define fi first 
#define se second 
#define bit(i,j) ((j >> i) & 1) 
#define lowbit(x) (x & (-x))
#define sigma main
using namespace std;

const long long inf = 1e18; 
const int mod = 1e9+7;
const int MAXN = 1e6+100;

#define int long long

struct fenwick_tree{
	#define ll long long
	ll n;
    vector<ll>ft;
    void init(ll _n){
        n = _n;
        ft.resize(n + 10);
    }
    void add(ll idx, ll val){
        while(idx <= n) ft[idx] = (ft[idx] + val), idx += (idx & (-idx));
    }
    ll get(ll idx){
        ll res = 0;
        while(idx > 0) res = (res + ft[idx]), idx -= (idx & (-idx));
        return res;
    }
    ll get(ll l, ll r){return get(r) - get(l - 1);} 
} T , S;

pll order[MAXN];
vector<int> adj[MAXN];
int Time = 0 , par[MAXN];

void dfs(int u , int p){
	for(int i = 0 ; i < adj[u].size() ; i++){
		int v = adj[u][i];
		if(v == p) continue;
		par[v] = u;
		order[v].fi = ++Time;
		dfs(v , u);
		order[v].se = ++Time;
	}

}
int32_t sigma(){
  	//freopen("MILITARYTRAINING.inp", "r", stdin);
	//freopen("MILITARYTRAINING.out", "w", stdout);
	ios_base::sync_with_stdio(0); cin.tie(0);
	
	int n , q; cin >> n >> q;
	for(int i = 1 ; i <= n ; i++){
		int k; cin >> k;
		while(k--){
			int x; cin >> x;
			adj[i].push_back(x);
		}
	}

	for(int i = 1 ; i <= n ; i++){
		reverse(adj[i].begin() , adj[i].end());
		int t = adj[i].back();
		adj[i].pop_back();
		reverse(adj[i].begin() , adj[i].end());
		adj[i].push_back(t);
	}

	dfs(1 , 1);
	
	vector<pll> query;
	vector<int> ans(q + 1);
	for(int i = 1 ; i <= q; i ++){
		int x; cin >> x;
		query.push_back({x , i});
	}
	sort(query.begin() , query.end());
	deque<pll> Q;

	assert(Time == (n-1)*2);
	T.init(Time+10) , S.init(Time+10);
	Q.push_back({1 , 0});
	int jj = 0;
	int state = 0 , tl = 0 , cnt = 0;
	while(Q.size()){
		pll t = Q.front(); Q.pop_front();
		int u = t.fi , st = t.se;
		if(st > state){
			for(; jj < query.size() && query[jj].fi <= tl + cnt * 2 ; jj++){
				pll X = query[jj];

				int res = -1;
				int l = 1 , r = Time;
				while(l <= r){
					int mid = l + r >> 1;
					if(S.get(1 , mid) >= X.fi - tl){
						res = mid ; r = mid-1;
					}else{
						l = mid+1;
					}
				}
				ans[X.se] = T.get(res , res);
				
			}
			tl += cnt * 2;
			state++;
		}
		
		if(u != 1){
			cnt++;
			T.add(order[u].fi , u);
			S.add(order[u].fi , 1);
			T.add(order[u].se , par[u]);
			S.add(order[u].se , 1);
		}
		vector<int> nxt;
		int K = 0;
		for(auto v : adj[u]){
			if(v == par[u]) K++;
			else{
				if(K == 0 || nxt.size() == 0) nxt.push_back(v);
				else Q.push_back({v , st + 1});
			}
		}

		while(nxt.size() > 0){
			Q.push_front({nxt.back() , st}); nxt.pop_back();
		}
	}

	for(; jj < query.size() ; jj++){
		pll &X = query[jj];
	
		X.fi -= tl;
		X.fi %= cnt * 2;
		if(X.fi == 0) X.fi = cnt * 2;
		int res = -1;
		int l = 1 , r = Time;
		while(l <= r){
			int mid = l + r >> 1;
			if(S.get(1 , mid) >= X.fi){
				res = mid ; r = mid-1;
			}else{
				l = mid+1;
			}
		}
		ans[X.se] = T.get(res , res);		
	}

	for(int i = 1 ; i <= q ; i++) cout << ans[i] << "\n";
	
	return 0;
}

Compilation message (stderr)

Main.cpp: In function 'void dfs(long long int, long long int)':
Main.cpp:42:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |  for(int i = 0 ; i < adj[u].size() ; i++){
      |                  ~~^~~~~~~~~~~~~~~
Main.cpp: In function 'int32_t main()':
Main.cpp:94:13: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |    for(; jj < query.size() && query[jj].fi <= tl + cnt * 2 ; jj++){
      |          ~~~^~~~~~~~~~~~~~
Main.cpp:100:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  100 |      int mid = l + r >> 1;
      |                ~~^~~
Main.cpp:136:11: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  136 |  for(; jj < query.size() ; jj++){
      |        ~~~^~~~~~~~~~~~~~
Main.cpp:145:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  145 |    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...