제출 #456360

#제출 시각아이디문제언어결과실행 시간메모리
456360DobromirAngelovFountain (eJOI20_fountain)C++14
100 / 100
296 ms22144 KiB
#include<bits/stdc++.h> #define endl '\n' using namespace std; struct rez { int d,v; }; struct torez { int nom,v; }; int n,q; rez a[100005]; int logN; torez spt[100005][20]; void getLog() { int i=0; while((1<<i)<n)i++; if((1<<i)==n)logN=i; logN=i-1; } void make_SpTable() { stack<int>st; for(int i=n;i>0;i--) { while(!st.empty()&&a[st.top()].d<=a[i].d)st.pop(); if(st.empty()) { st.push(i); spt[i][0].nom=0; spt[i][0].v=a[i].v; continue; } spt[i][0].nom=st.top(); spt[i][0].v=a[i].v; st.push(i); } for(int j=1;j<=logN;j++) { for(int i=1;i<=n;i++) { if(spt[i][j-1].nom)spt[i][j].nom=spt[spt[i][j-1].nom][j-1].nom; if(spt[i][j-1].nom)spt[i][j].v=spt[i][j-1].v+spt[spt[i][j-1].nom][j-1].v; else spt[i][j].v=spt[i][j-1].v; } } } int query(int nom,int v) { if(!nom)return 0; if(v<=a[nom].v)return nom; int i=0; while(spt[nom][i].v<v && spt[nom][i].nom>0 && i<logN)i++; if(spt[nom][i].v>=v&&i>0)i--; return query(spt[nom][i].nom,v-spt[nom][i].v); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>q; for(int i=1;i<=n;i++) { cin>>a[i].d>>a[i].v; } getLog(); make_SpTable(); int nom,v; for(int t=0;t<q;t++) { cin>>nom>>v; cout<<query(nom,v)<<endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...