30pts 过不去求调
查看原帖
30pts 过不去求调
1359837
Dream_Stars楼主2024/12/21 09:56

rt

# include <bits/stdc++.h>

# define int long long
# define PII pair <int ,int>

using namespace std;

inline int read(){int s = 0 , w = 0;char c = getchar();while(!isdigit(c)){w |= (c == '-');c = getchar();}while(isdigit(c)){s = (s << 1) + (s << 3) + (c ^ 48);c = getchar();}return w ? -s : s;}
inline void write(int x){if(x < 0) putchar('-') , x = -x;if(x > 9) write(x / 10);putchar(x % 10 | 48);}
inline void writesp(int x){write(x) , putchar(' ');}
inline void writeln(int x){write(x) , putchar('\n');}

const int N = 1e5 + 10;
int n ,Q ,d[N] ,c[N] ,nxt[N] ,fnxt[N][21] ,f[N][21];

stack < PII > sta;

signed main (){
  n = read () ,Q = read ();

 // memset (fnxt ,0x3f ,sizeof fnxt);
  memset (f ,0x3f ,sizeof f);
  int inf = fnxt[0][0];

  //d[n + 1] = c[n + 1] = inf;

  for (int i = 1 ; i <= n ; i ++){
    d[i] = read () ,c[i] = read ();
    
    while (!sta.empty () && d[i] > sta.top().first){
      fnxt[sta.top().second][0] = i;
      sta.pop ();
    }
    sta.push (make_pair (d[i] ,i));
    //d[i] 半径,c[i] 容量。
    f[i][0] = c[i];
  }
  for (int j = 1 ; j <= 20 ; j ++)
    for (int i = 1 ; i + (1 << j) - 1 <= n ; i ++){
      fnxt[i][j] = fnxt[fnxt[i][j - 1]][j - 1];
      f[i][j] = f[i][j - 1] + f[fnxt[i][j - 1]][j - 1];
    }

  while (Q --){
    int r = read () ,v = read ();
    for (int i = 20 ; i >= 0 ; i --)
      if (f[r][i] < v) v -= f[r][i] ,r = fnxt[r][i] /*,writesp (v) ,writesp (r) ,writeln (f[r][i])*/;

    writeln (r);
  } 
  return 0;
}
2024/12/21 09:56
加载中...