#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
#define fast ios_base::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
#define fi first
#define se second
#define space " "
#define endl "\n"
#define gcd __gcd
#define mp make_pair
#define pb push_back
#define pf push_front
#define lb lower_bound
#define ub upper_bound
#define md 1000000007
#define inf 1000000000000000
#define li 100005
#define int long long
using namespace std;
int T,Q,n,m,d[li],c[li],subtree[li],lca[li][25],x,y;
string s,t;
vector<int> v[li];
set<pair<int,int> > st;
void dfs(int node,int ata){
lca[node][0]=ata;
//~ printf("Child Costs: %d %d %d %d\n",node,ata,subtree[node],subtree[ata]);
subtree[node]+=subtree[ata];
for(int i=0;i<(int)v[node].size();i++){
int go=v[node][i];
if(go==ata) continue;
dfs(go,node);
}
}
int32_t main(){
scanf("%lld %lld",&n,&Q);
for(int i=1;i<=n;i++){
scanf("%lld %lld",&d[i],&c[i]); //~ IYYEAH
subtree[i]=c[i];
}
d[n+1]=inf;
c[n+1]=0;
st.insert(mp(d[n+1],n+1));
for(int i=n;i>=1;i--){
while((int)st.size()){
pair<int,int> temp=*st.begin();
if(temp.fi<=d[i])st.erase(st.begin());
else break;
}
pair<int,int> temp=*st.begin();
v[i].pb(temp.se);
v[temp.se].pb(i);
st.insert(mp(d[i],i));
//~ printf("Edges: %d %d\n",i,temp.se);
}
dfs(n+1,0);
for(int i=1;i<=20;i++){
for(int j=1;j<=n+1;j++){
lca[j][i]=lca[lca[j][i-1]][i-1];
}
}
while(Q--){
scanf("%lld %lld",&x,&y);
//~ printf("xD %d\n",subtree[x]);
//~ if(subtree[x]<y){printf("0\n"); continue;}
int bas=1,son=5*n;
while(bas<=son){
int mid=(bas+son)/2;
int sayi=mid,node=x;
for(int i=20;i>=0;i--){
if(sayi>=(1ll<<i)){sayi-=(1ll<<i); node=lca[node][i];}
}
if(subtree[x]-subtree[node]>=y) son=mid-1;
else bas=mid+1;
}
//~ printf("Debuggi %d %d\n",bas,son);
for(int i=20;i>=0;i--){
if(son>=(1ll<<i)){son-=(1ll<<i); x=lca[x][i];}
}
if(x==0 || x==n+1) printf("0\n");
else printf("%lld\n",x);
}
return 0;
}
Compilation message (stderr)
fountain.cpp: In function 'int32_t main()':
fountain.cpp:35:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
35 | scanf("%lld %lld",&n,&Q);
| ~~~~~^~~~~~~~~~~~~~~~~~~
fountain.cpp:37:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
37 | scanf("%lld %lld",&d[i],&c[i]); //~ IYYEAH
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
fountain.cpp:62:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
62 | scanf("%lld %lld",&x,&y);
| ~~~~~^~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |