Submission #440327

#TimeUsernameProblemLanguageResultExecution timeMemory
440327raidFountain (eJOI20_fountain)C++17
100 / 100
971 ms28244 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[MAXLOG][MAXN];
int lg2[MAXN], lev[MAXN], w[MAXN];

inline int getAnc( int node, int k ) {
  int lg = lg2[k];
  while ( k ) {
	node = anc[lg][node];
	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 );
	}
  }
}
inline int fth( int node ) {
  return anc[0][node];
}
inline int bsn( int node, int sum ) {
  int k = lev[node], s = 0, lg = lg2[k], mid_node;
  int cpnode = node;

  if ( v[node].vol >= sum ) {
	return node;
  }

  while ( k && s + S[node] - S[anc[lg][node]] < sum ) {
	s += (S[node] - S[anc[lg][node]]);
	node = anc[lg][node];
	k -= (1 << lg);
	lg = lg2[k];
  }
  while ( lg ) {
	mid_node = anc[--lg][node];
	if ( s + S[node] - S[mid_node] < sum ) {
      s += S[node] - S[mid_node];
	  node = mid_node;
	}
  }
  return node;
}

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[0][s.back()] = i;
	  s.pop_back();
	}
	s.push_back( i );
  }
  while ( s.size() ) {
	G[0].push_back( s.back() );
	anc[0][s.back()] = 0;
	s.pop_back();
  }
  DFS( 0, 0 );
  for ( int p = 1; p < MAXLOG; ++p ) {
    for	( int i = 1; i <= n; ++i ) {
      anc[p][i] = anc[p - 1][anc[p - 1][i]];
	}
  }
  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;
}

Compilation message (stderr)

fountain.cpp: In function 'int bsn(int, int)':
fountain.cpp:44:7: warning: unused variable 'cpnode' [-Wunused-variable]
   44 |   int cpnode = node;
      |       ^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...