Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <string>
- #include <math.h>
- #include <climits>
- //#pragma GCC optimize("O3, unroll-loops");
- #include <list>
- #include <map>
- #include <set>
- #include <queue>
- #include <unordered_map>
- #include <unordered_set>
- //#include <chrono>
- //#include <fstream>
- //#include <bits/stdc++.h>
- #define mp make_pair
- #define pb push_back
- #define eb emplace_back
- #define x first
- #define y second
- #define sz(x) (int)x.size()
- #define all(x) begin(x), end(x)
- #define rall(x) rbegin(x), rend(x)
- #define FOR(i,a,b) for (int i = (a); i < (b); i++)
- #define RFOR(i,b,a) for (int i = (b) - 1; i >= (a); i--)
- using namespace std;
- typedef unsigned long long ull;
- typedef long long ll;
- typedef long double ld;
- typedef pair<int, int> pi;
- typedef pair<ll, ll> pl;
- typedef vector<int> veci;
- typedef vector<bool> vecb;
- typedef vector<vector<int>> vvi;
- typedef vector<vector<bool>> vvb;
- const int INF_I = 1e9;
- const ll INF_LL = 1e18;
- int n, len;
- veci a;
- vector<pi> sq;
- veci to;
- void build() {
- RFOR(i, n, 0) {
- int gr = i / len;
- if (i + a[i] >= n || i + a[i] >= (gr + 1) * len) {
- sq[i].x = 1;
- sq[i].y = (i + a[i] < n ? i + a[i] : -1);
- }
- else {
- if (sq[i + a[i]].y == -1) {
- sq[i].x = 1;
- sq[i].y = i + a[i];
- }
- else {
- sq[i].x = sq[i + a[i]].x + 1;
- sq[i].y = sq[i + a[i]].y;
- }
- }
- }
- }
- pi start(int in) {
- in--;
- int d = 0;
- int cur = in;
- for (; sq[cur].y != -1; cur = sq[cur].y)
- d += sq[cur].x;
- return make_pair(d + 1, cur + 1);
- }
- void update(int in, int val) {
- in--;
- a[in] = val;
- int gr = in / len;
- RFOR(i, in + 1, gr*len) {
- if (i + a[i] >= n || i + a[i] >= (gr + 1) * len) {
- sq[i].x = 1;
- sq[i].y = (i + a[i] < n ? i + a[i] : -1);
- }
- else {
- if (sq[i + a[i]].y == -1) {
- sq[i].x = 1;
- sq[i].y = i + a[i];
- }
- else {
- sq[i].x = sq[i + a[i]].x + 1;
- sq[i].y = sq[i + a[i]].y;
- }
- }
- }
- }
- int main() {
- /*ifstream cin("in.txt");
- ofstream cout("out.txt");
- auto start_time = chrono::high_resolution_clock::now();*/
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int m;
- cin >> n >> m;
- len = ceil(sqrt(n));
- sq.assign(n, mp(0, 0));
- a.assign(n, 0);
- for (int i = 0; i < n; i++)
- cin >> a[i];
- build();
- while (m--) {
- int z;
- cin >> z;
- if (!z) {
- int a, b;
- cin >> a >> b;
- update(a, b);
- }
- else {
- int a;
- cin >> a;
- pi res = start(a);
- cout << res.y << " " << res.x << "\n";
- }
- }
- /*auto end_time = chrono::high_resolution_clock::now();
- chrono::duration<double> duration = end_time - start_time;
- cout << duration.count() << "\n";
- cin.close();
- cout.close();*/
- return 0;
- }
Add Comment
Please, Sign In to add comment