Submission #409130

#TimeUsernameProblemLanguageResultExecution timeMemory
409130victoriadFountain (eJOI20_fountain)C++14
0 / 100
86 ms52520 KiB
#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> #include <utility> #include <queue> #include <map> #include <iomanip> #include <stack> #include <fstream> using namespace std; vector<int>v; vector<long long int>d; vector<vector<int> >up; int search(long long int l,vector<long long int>&ps,int r){ int low=0,hi=18,mid,re=-1; while(low<=hi){ mid=low+(hi-low)/2; if(ps[up[r][mid]]>l){ low=mid+1; re=mid; } else{ hi=mid-1; } } if(re==-1)return 0; if(ps[up[r][1]]<=l)return up[r][re]+1; return search(l,ps,up[r][re]); } void suma(vector<long long int>&ps,vector<vector<int> >&c,int nodo){ if(up[nodo][1]==-1)ps[nodo]=v[nodo]; else ps[nodo]=ps[up[nodo][1]]+v[nodo]; for(int y:c[nodo]){ suma(ps,c,y); } } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); int n,q; cin>>n>>q; int l,r; v.resize(n); d.resize(n); for(int i=0;i<n;i++){ cin>>d[i]>>v[i]; } vector<vector<int> >con(n); up.resize(n); vector<int>a(28,-1); for(int i=0;i<n;i++)up[i]=a; for(int i=0;i<n;i++)up[i][0]=i; long long int an=-1,u=0; up[n-1][1]=-1; for(int i=0;i<n-1;i++){ bool b=true; int x=i+1; if(an!=-1 && d[i]>=u)x=an; for(int k=x;k<n;k++){ if(d[i]<d[k]){ up[i][1]=k; b=false; con[k].push_back(i); an=k; break; } } if(b){ an=-1; up[i][1]=-1; } u=d[i]; } vector<long long int>ps(n,0); for (int i=0;i<n;i++){ if(up[i][1]==-1){ suma(ps,con,i); } } for(int l=2;l<18;l++){ for(int i=0;i<n;i++){ if(up[i][l-1]!=-1)up[i][l]=up[up[i][l-1]][l-1]; } } for(int i=0;i<q;i++){ cin>>r>>l; r--; if(l<=v[r])cout<<r+1<<"\n"; else if(ps[r]-l<0)cout<<0<<"\n"; else cout<<search(ps[r]-l,ps,r)<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...