提交时间:2024-10-04 17:04:23
运行 ID: 33221
#include <bits/stdc++.h> using namespace std; int n,q; int x,y; struct node{ int v,sum; }b[100005]; int dis[100005],mp[100005]; int minn; int top=0; void dfs(){ queue<int> q; dis[x]=0; mp[x]=1; q.push(x); while (!q.empty()){ int hd=q.front(); q.pop(); mp[hd]=0; for (int i=1;i<=top;i++){ int s=hd/b[i].v; if (dis[s]>dis[hd]+b[i].sum){ dis[s]=dis[hd]+b[i].sum; if (!mp[s]){ mp[s]=1; q.push(s); } } } if (hd<=y){ minn=min(minn,dis[hd]); } } } int main(){ // cin>>n>>q; scanf("%d%d",&n,&q); for (int i=1;i<=n;i++){ int s1; // cin>>s1; scanf("%d",&s1); while (top and b[top].sum>=s1) top--; b[++top].v=i; b[top].sum=s1; } while (q--){ // cin>>x>>y; scanf("%d%d",&x,&y); minn=0x3f3f3f3f; memset(dis,0x3f3f3f3f,sizeof(dis)); if (x<=y){ // cout<<0<<endl; printf("0\n"); continue; } dfs(); // cout<<minn<<endl; printf("%d\n",minn); } return 0; }