Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<set>
- #include <unordered_set>
- #include <unordered_map>
- #include<map>
- #include<list>
- #include<iomanip>
- #include<cmath>
- #include<string>
- #include<vector>
- #include<queue>
- #include<stack>
- #include<complex>
- #include<sstream>
- #include<iostream>
- #include<fstream>
- #include<algorithm>
- #include<numeric>
- #include<utility>
- #include<functional>
- #include<stdio.h>
- #include<assert.h>
- #include<memory.h>
- #include<bitset>
- #include<math.h>
- #include <string.h>
- #include <strings.h>
- #define f first
- #define s second
- #define mp make_pair
- #define pb push_back
- #define lp(i,a,n) for(int i=(a);i<=(int)(n);++i)
- #define lpd(i,a,n) for(int i=(a);i>=(int)(n);--i)
- #define clr(a,b) memset(a,b,sizeof a)
- #define all(v) v.begin(),v.end()
- #define println(a) cout <<(a) <<endl
- #define sz(x) ((int)(x).size())
- #define readi(x) scanf("%d",&x)
- #define read2i(x,y) scanf("%d%d",&x,&y)
- #define read3i(x,y,z) scanf("%d%d%d",&x,&y,&z)
- #define readll(x) scanf("%I64d",&x)
- #define mod 1000000007
- #define eps 1e-6
- #define infi 1000000000
- #define infll 1000000000000000000ll
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> pii;
- typedef pair<ll, ll> pll;
- typedef vector<int> vi;
- typedef vector<vi> vvi;
- typedef vector<ll> vll;
- typedef set<int> si;
- typedef unordered_set<int> usi;
- typedef map<int,int> mii;
- typedef map<ll,ll> mll;
- typedef unordered_map<ll,ll> umll;
- const int N = 100005 , BLOCK_SIZE = 320;
- int n,q,t,level[N],startTime[N],endTime[N],perant[N],last[N];
- vi adjL[N];
- void DFS(int node,int depth, int l) {
- startTime[node] = ++t;
- level[node] = depth;
- last[node] = l;
- for(int ch:adjL[node]) DFS(ch, depth+1,!node?ch:l);
- endTime[node] = t;
- }
- vi updated;
- pii solve(int a) {
- pii ret(0,last[a]);
- for(int p:updated) if(startTime[p] <= startTime[a] && endTime[p] >= endTime[a]){
- ret.f += level[a]-level[p]+1;
- a = perant[p];
- if(a) ret.s = last[a];
- else ret.s = last[p];
- }
- return {ret.f + level[a],ret.s};
- }
- int main(){
- scanf("%d%d",&n,&q);
- lp(i, 1, n) {
- int a;
- scanf("%d",&a);
- a += i;
- if(a > n) a = 0 ;
- adjL[a].pb(i);
- perant[i] = a;
- }
- DFS(0, 0 ,0);
- vi temp;
- lp(i, 1, q) {
- if(q%BLOCK_SIZE == 0) {
- updated.clear();
- lp(i, 1, n) adjL[perant[i]].pb(i);
- t = 0 ,DFS(0, 0 ,0);
- }
- int t,a,b;
- scanf("%d%d",&t,&a);
- if(!t) {
- scanf("%d",&b);
- b += a;
- if(b > n) b = 0;
- if(b == perant[a]) continue;
- perant[a] = b ;
- if(!b) last[a] = a;
- while(!updated.empty() && level[updated.back()] < level[a])
- temp.pb(updated.back()) , updated.pop_back();
- updated.pb(a);
- while (!temp.empty()) updated.pb(temp.back());
- } else {
- pii ans = solve(a);
- printf("%d %d\n",ans.s,ans.f);
- }
- }
- }
- //freopen("input.txt","r",stdin);
- //freopen("output.txt","w",stdout);
- //ios::sync_with_stdio(0);cin.tie(0);
- /*
- 10 10
- 5 1 2 4 1 7 3 8 10 8
- 0 5 6
- 1 8
- 1 1
- 0 10 3
- 1 5
- 1 3
- 1 2
- 0 6 1
- 1 9
- 1 1
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement