#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;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
204 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
86 ms |
52520 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
204 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |