#include using namespace std; #define rep(i,n) REP(i,0,n) #define REP(i,s,e) for(int i=(s); i<(int)(e); i++) #define repr(i, n) REPR(i, n, 0) #define REPR(i, s, e) for(int i=(int)(s-1); i>=(int)(e); i--) #define pb push_back #define all(r) r.begin(),r.end() #define rall(r) r.rbegin(),r.rend() #define fi first #define se second typedef long long ll; typedef vector vi; typedef vector vl; typedef pair pii; typedef pair pll; const ll INF = 1e18; const ll MOD = 1e9 + 7; const double EPS = 1e-8; template T chmax(T& a, const T& b){return a = (a > b ? a : b);} template T chmin(T& a, const T& b){return a = (a < b ? a : b);} #define DEBUG_MODE #ifdef DEBUG_MODE #define dump(x) cout << #x << " : " << x << " " #define dumpL(x) cout << #x << " : " << x << '\n' #define LINE cout << "line : " << __LINE__ << " " #define LINEL cout << "line : " << __LINE__ << '\n' #define dumpV(v) cout << #v << " : ["; for(auto& t : v) cout << t << ", "; cout<<"]" << " " #define dumpVL(v) cout << #v << " : ["; for(auto& t : v) cout << t << ", "; cout<<"]" << endl #define STOP assert(false) #else #define dump(x) #define dumpL(x) #define LINE #define LINEL #define dumpV(v) #define dumpVL(v) #define STOP assert(false) #endif #define mp make_pair namespace std { template ostream &operator <<(ostream& out, const pair& a) { out << '(' << a.fi << ", " << a.se << ')'; return out; } } namespace Doubling { using NODE_TYPE = int; using COST_TYPE = long long; // d[i][0]はあらかじめ計算しておく! void preCalc(vector>& d, vector>& over) { int n = d.size(); int m = d[0].size(); REP(j, 1, m) rep(i, n) { int cur = d[i][j-1]; d[i][j] = d[d[i][j-1]][j-1]; over[i][j] = over[i][j-1] + over[cur][j-1]; } } // 頂点uからcostでいける頂点を求める ll getNode(NODE_TYPE u, COST_TYPE cost, const vector>& d, vector>& over) { int n = d.size(); int m = d[0].size(); NODE_TYPE cur = u; ll x = 0; repr(j, m) { if(cost&(COST_TYPE(1)<>& d) { if(u >= v) assert(false); int n = d.size(); int m = d[0].size(); int cur = u; COST_TYPE ret = 0; while(cur < v) { if(d[cur][0] >= v) { ret += 1; break; } int j = lower_bound(all(d[cur]), v) - d[cur].begin() - 1; cur = d[cur][j]; ret+= COST_TYPE(1) << j; } return ret; } }; int main(){ cin.tie(0); ios::sync_with_stdio(false); int n, k; cin >> n >> k; vi p(n); rep(i, n) cin >> p[i]; vector d(n, vi(40, -1)); vector over(n, vi(40, -1)); rep(i, n) { d[i][0] = (i+p[i]) %n; over[i][0] = (i >= d[i][0] ? 1 : 0); // dump(i);dump(d[i][0]);dumpL(over[i][0]); } Doubling::preCalc(d, over); rep(i, n) { cout << Doubling::getNode(i, k, d, over)+1 << '\n'; } return 0; }