#include using namespace std; using ll = long long int; using iPair = pair; using lPair = pair; using ivector = vector; using lvector = vector; using istack = stack; using iqueue = queue; using ivv = vector>; using lvv = vector>; const int INF = 0x3f3f3f3f; const ll LINF = 0x3f3f3f3f3f3f3f3f; vector dir = {{1,0}, {-1,0}, {0,1}, {0,-1}}; #define dump(x) cout << #x << " = " << (x) << endl #define ALL(x) begin(x),end(x) #define rep(i,s,e) for(ll i=(ll)(s), i_stop=(ll)(e); i bool chmax(T& a, S b) {b = (T)b; if(a bool chmin(T& a, S b) {b = (T)b; if(a>b) {a=b;return true;} return false;} template void printArr(vector &arr){ for(auto &x:arr) {cout << x << " ";} cout << endl; } // =====================================================> // 排名 0-indexed #define maxm 10000 lvector tree[4*maxm+10]; lvector E; ll n,q,m,M; // M是剛好大於等於_m的2的冪. M = 2^(ceil(log(m,2))) void init(ll _m){ ll x = 1; while(x < m) x <<= 1; M = x; range(j, 0, n) E.push_back(j); range(i, 0, 2*M-1) tree[i] = E; } lvector merge(lvector a, lvector b) { lvector c(n); range(i,0,n) c[i] = b[a[i]]; return c; } void update(ll k, lvector p) { k = k+M-1; tree[k] = p; while(k) { k = (k-1)/2; tree[k] = merge(tree[2*k+1], tree[2*k+2]); } } lvector _rmq(ll a, ll b, ll k, ll l, ll r) { // 1. 無交集 if(b<=l || r<=a) return E; // 2. 這個區間是解區間的一個子集 if(a<=l && r<=b) return tree[k]; ll mid = l + (r-l)/2; lvector v1 = _rmq(a, b, 2*k+1, l, mid); lvector v2 = _rmq(a, b, 2*k+2, mid, r); return merge(v1, v2); } lvector rmq(ll a, ll b) { return _rmq(a, b, 0, 0, M); } void solve() { cin>>n>>m>>q; init(m+1); while(q--) { ll op; cin>>op; if(op == 1) { ll d; cin>>d; lvector tmp(n); range(i,0,n) {cin>>tmp[i]; --tmp[i];} update(d, tmp); }else if(op == 2) { ll s; cin>>s; lvector tmp = rmq(0, s+1); lvector res(n); range(i,0,n) res[tmp[i]] = i+1; for(auto x: res) cout<>l>>r; lvector resl = rmq(0, l); lvector resr = rmq(0, r+1); ll ans = 0; range(i, 0, resl.size()) ans += labs(resl[i] - resr[i]); cout<