New Year is coming, and Jaehyun decided to read many books during 2015, unlike this year. He has n books numbered by integers from 1 to n. The weight of the i-th (1 ≤ i ≤ n) book is wi.
As Jaehyun's house is not large enough to have a bookshelf, he keeps the n books by stacking them vertically. When he wants to read a certain book x, he follows the steps described below.
- He lifts all the books above book x.
- He pushes book x out of the stack.
- He puts down the lifted books without changing their order.
- After reading book x, he puts book x on the top of the stack.
He decided to read books for m days. In the j-th (1 ≤ j ≤ m) day, he will read the book that is numbered with integer bj (1 ≤ bj ≤ n). To read the book, he has to use the process described in the paragraph above. It is possible that he decides to re-read the same book several times.
After making this plan, he realized that the total weight of books he should lift during m days would be too heavy. So, he decided to change the order of the stacked books before the New Year comes, and minimize the total weight. You may assume that books can be stacked in any possible order. Note that book that he is going to read on certain step isn't considered as lifted on that step. Can you help him?
The first line contains two space-separated integers n (2 ≤ n ≤ 500) and m (1 ≤ m ≤ 1000) — the number of books, and the number of days for which Jaehyun would read books.
The second line contains n space-separated integers w1, w2, ..., wn (1 ≤ wi ≤ 100) — the weight of each book.
The third line contains m space separated integers b1, b2, ..., bm (1 ≤ bj ≤ n) — the order of books that he would read. Note that he can read the same book more than once.
Print the minimum total weight of books he should lift, which can be achieved by rearranging the order of stacked books.
3 5 1 2 3 1 3 2 3 1
12
Here's a picture depicting the example. Each vertical column presents the stacked books.

题意:有N本重量为w[n]的书,现在是有m天,每天都要读一本书b[i],但是由于书在书架上的位置,所以需要把上面的书搬掉来拿到b[i]本书,求需要搬掉的书的最小重量为多少。
解题思路:这里有两点需要我们注意,第一点是初始书的摆放位置就是b[m]数列中书的出现的位置,具体的证明不会,我也是看的别人的思路才知道,看了很久才看懂,感觉自己的智商是1。再一个点是只有书的位置正好在最上面才能不用搬书,因为初始位置,所以第一天都不需要搬书,其他的就拿b[i]来说,假如第i天要看的书是b[i],需不需要搬书就取决于b[i-1]如果正好前一天也是这本书即b[i-1]=b[i]那么就不需要移动书,否则的话,就需要把b[i-1]这本书移走,然后再考虑i-2这一天。。。。一直考虑到第1天,但是其中有两种情况需要注意,第一种是第k天的书正好也是b[i],这时候就只需要找到这里,就可以终止了,因为这时候b[I]是在书架的最上面。第二种情况是第k天的书b[k]与第k+x天的书b[k+x]一样,这时候,我们就不需要重复搬书,所以我们用一个v[]数组来表示是否是已经标记过的。
AC代码:
//#include<iostream>
//#include<algorithm>
//#include<String>
#include<bits/stdc++.h>
using namespace std;
int n, m;
const int maxn = 1000 + 10;
int w[maxn], b[maxn];
bool v[maxn];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> w[i];
}
for (int i = 1; i <= m; i++)
{
cin >> b[i];
}
int ans = 0;
for (int i = 2; i <= m; i++)
{
memset(v, 0, sizeof(v));
for (int j = i - 1; j >= 1; j--)
{
if (b[j] == b[i]) break;
if (!v[b[j]])
{
ans += w[b[j]];
v[b[j]] = true;
}
}
}
cout << ans << endl;
return 0;
}