Pagini recente » Cod sursa (job #1488162) | Cod sursa (job #2487383) | Cod sursa (job #724302) | Cod sursa (job #281339) | Cod sursa (job #2366036)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("panza.in");
ofstream fout("panza.out");
int n, m, s, f, a[100005], d[1005][1005], b[100005], c[100005];
pair <int, int> e[100005];
int main()
{
fin >> n >> m >> s >> f;
for(int i = 1; i <= m; i++)
fin >> a[i];
for(int i = 1; i <= m ; i++)
for(int j = i; j <= m; j++)
{
if(i == j)
d[i][j] = min(a[i], d[i-1][j-1]+2);
else
d[i][j] = min(d[i][j-1]+1, j-i+a[j]);
}
for(int i = 1; i <= n; i++)
{
int x, y;
fin >> x >> y;
e[i].first = x;
e[i].second = y;
}
for(int i = e[1].first; i <= e[1].second; i++)
b[i] = abs(s-i);
for(int i = 2; i <= n; i++)
{
for(int k = 1; k <= m; k++) c[k] = (1<<30);
for(int k = e[i].first; k <= e[i].second; k++)
{
for(int p = e[i-1].first; p <= e[i-1].second; p++)
{
c[k] = min(c[k],d[min(p,k)][max(p,k)] + b[p]);
}
}
for(int k = 1; k <= m; k++)
b[k] = c[k];
}
int ans = (1<<30);
for(int i = e[n].first; i <= e[n].second; i++)
ans = min(ans, abs(f-i)+b[i]);
fout << ans;
return 0;
}