Problem:
Score : 1400 points

Problem Statement

Snuke got an integer sequence from his mother, as a birthday present. The sequence has N elements, and the i-th of them is i.
Snuke performs the following Q operations on this sequence. The i-th operation, described by a parameter q_i, is as follows:

Take the first q_i elements from the sequence obtained by concatenating infinitely many copy of the current sequence, then replace the current sequence with those q_i elements.

After these Q operations, find how many times each of the integers 1 through N appears in the final sequence.

Constraints

1 ≦ N ≦ 10^5

0 ≦ Q ≦ 10^5

1 ≦ q_i ≦ 10^{18}

All input values are integers.

Input

The input is given from Standard Input in the following format:

N Q
q_1
:
q_Q

Output

Print N lines. The i-th line (1 ≦ i ≦ N) should contain the number of times integer i appears in the final sequence after the Q operations.

Sample Input 1

5 3
6
4
11

Sample Output 1

3
3
3
2
0

After the first operation, the sequence becomes: 1,2,3,4,5,1.

After the second operation, the sequence becomes: 1,2,3,4.

After the third operation, the sequence becomes: 1,2,3,4,1,2,3,4,1,2,3.

In this sequence, integers 1,2,3,4,5 appear 3,3,3,2,0 times, respectively.

Sample Input 2

10 10
9
13
18
8
10
10
9
19
22
27

Sample Output 2

7
4
4
3
3
2
2
2
0
0

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

int main(){
    int N, Q;
    cin >> N >> Q;
    vector<int64_t> S = {N};
    for(int i=0; i<Q; i++){
        int64_t q;
        cin >> q;
        while(S.size() && S.back() >= q) S.pop_back();
        S.push_back(q);
    }
    int N_org = N;
    N = S[0];
    Q = S.size();

    vector<int64_t> num(Q);
    vector<int> tail(Q);
    vector<int> follow(Q);
    num[Q-1] = 1;
    tail[0] = N-1;
    multiset<pair<int64_t, int>> st;

    for(int i=Q-1; i>=0; i--){
        while(st.size()){
            auto it = prev(st.end());
            int64_t len = it->first;
            int idx = it->second;
            if(len >= S[i]){
                int64_t times = len / S[i];
                num[i] += num[idx] * times;
                int64_t rem = len % S[i];
                if(rem){
                    st.insert({rem, idx});
                }else{
                    tail[idx] = -1;
                    follow[idx] = i;
                }
                st.erase(it);
            }else{
                break;
            }
        }
        st.insert({S[i], i});
    }

    for(auto& p : st){
        int len = p.first, idx = p.second;
        tail[idx] = (len + N - 1) % N;
    }

    for(int i=0; i<Q; i++) if(tail[i] == -1) tail[i] = tail[follow[i]];
    
    vector<int64_t> ans(N_org);
    for(int i=0; i<Q; i++) ans[tail[i]] += num[i];
    for(int i=N-2; i>=0; i--) ans[i] += ans[i+1];
    for(int i=0; i<N_org; i++) cout << ans[i] << endl;

    return 0;
}