Submission #440191

#TimeUsernameProblemLanguageResultExecution timeMemory
440191raidFountain (eJOI20_fountain)C++17
60 / 100
1560 ms27768 KiB
#include <iostream>
#include <vector>

using namespace std;

const int MAXN = 100005;
const int MAXLOG = 18;

struct rsv {
  int diam, vol;
} v[MAXN];

vector<int> s; 
vector<int> G[MAXN];
int S[MAXN];

int anc[MAXN][MAXLOG];
int lg2[MAXN], lev[MAXN], w[MAXN];

int getAnc( int node, int k ) {
  int lg = lg2[k];
  while ( k ) {
	node = anc[node][lg];
	k -= (1 << lg);
	lg = lg2[k];
  }
  return node;
}
void DFS( int node, int dep ) {
  w[node] = 1;
  lev[node] = dep;
  for ( int i = 0; i < (int)G[node].size(); ++i ) {
	if ( !w[G[node][i]] ) {
	  S[G[node][i]] = S[node] + v[G[node][i]].vol;
	  DFS( G[node][i], dep + 1 );
	}
  }
}
int bsn( int node, int sum ) {
  int l = 0, r = lev[node], mid, mid_node;
  
  if ( v[node].vol >= sum ) {
	return node;
  }
  while ( r - l > 1 ) {
    mid = (l + r) / 2;
	mid_node = getAnc( node, lev[node] - mid + 1 );
	if ( S[node] - S[mid_node] < sum ) {
	  r = mid;
	} else {
	  l = mid;
	}
  }
  return getAnc( node, lev[node] - l );
}

int main() {
  int n, q, fvol, k;

  cin >> n >> q;
  for ( int i = 1; i <= n; ++i ) {
	cin >> v[i].diam >> v[i].vol;
  }
  s.push_back( 1 );
  for ( int i = 2; i <= n; ++i ) {
	while ( s.size() && v[s.back()].diam < v[i].diam ) {
	  G[i].push_back( s.back() );
	  anc[s.back()][0] = i;
	  s.pop_back();
	}
	s.push_back( i );
  }
  while ( s.size() ) {
	G[0].push_back( s.back() );
	anc[s.back()][0] = 0;
	s.pop_back();
  }
  DFS( 0, 0 );
  for ( int p = 1; p <= MAXLOG - 1; ++p ) {
    for	( int i = 1; i <= n; ++i ) {
      anc[i][p] = anc[anc[i][p - 1]][p - 1];
	}
  }
  for ( int i = 2; i <= n; ++i ) {
	lg2[i] = lg2[i >> 1] + 1;
  }
  while ( q-- ) {
    cin >> k >> fvol;
    cout << bsn( k, fvol ) << "\n";
  }
  return 0;
}
/*
  int b = getAnc( node, lev[node] - r );
  
  if ( S[node] - S[a] <= sum && S[node] - S[b] <= sum ) {
	if ( l < r ) {
	  return a;
	}
	return b;
  } else if ( S[node] - S[a] <= sum ) {
	return a;
  }
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...