Advertisement
esraa_syam

2024

Oct 21st, 2024
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.89 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. using namespace std;
  3.  
  4. #define nl "\n"
  5. #define ll long long
  6. #define mod  1'000'000'007
  7. #define all(v) v.begin(), v.end()
  8. #define rall(v) v.rbegin(), v.rend()
  9. #define sz(v) (int) v.size()
  10.  
  11. template<typename T = int>
  12. istream &operator>>(istream &in, vector<T> &v) {
  13.     for (auto &x: v) in >> x;
  14.     return in;
  15. }
  16.  
  17. template<typename T = int>
  18. ostream &operator<<(ostream &out, const vector<T> &v) {
  19.     for (const T &x: v) out << x << " ";
  20.     return out;
  21. }
  22.  
  23. void Sira() {
  24.     ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  25. #ifndef ONLINE_JUDGE
  26.     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
  27. #endif
  28. }
  29. struct node {
  30.     int mini;
  31.  
  32.     node(){
  33.         mini = INT_MAX;
  34.     }
  35.  
  36.     node(int val){
  37.         mini = val;
  38.     }
  39.  
  40.  
  41. };
  42.  
  43. struct SegTree{
  44.     int seg_size = 1;
  45.     vector < node > tree;
  46.  
  47.     SegTree(int n){
  48.         while(seg_size < n) seg_size *= 2;
  49.         tree.assign(2 * seg_size, node());
  50.     }
  51.  
  52.     node merge(node a, node b){
  53.         node res = node();
  54.         res.mini = min(a.mini, b.mini);
  55.         return res;
  56.     }
  57.  
  58.     void build(vector < int > &a, int x, int lx, int rx){
  59.         if(rx - lx == 1){
  60.             if(lx < sz(a)){
  61.                 tree[x] = node(a[lx]);
  62.             }
  63.             return;
  64.         }
  65.         int m = (lx + rx) / 2;
  66.         build(a, 2 * x + 1, lx, m);
  67.         build(a, 2 * x + 2, m, rx);
  68.         tree[x] = merge(tree[2 * x + 1], tree[2 * x + 2]);
  69.     }
  70.  
  71.     void build(vector < int > &a){
  72.         build(a, 0, 0, seg_size);
  73.     }
  74.  
  75.     void update(int idx , int val , int ni , int lx , int rx){
  76.         if(rx - lx == 1){
  77.             tree[ni] = node(val);
  78.             return;
  79.         }
  80.         int m = (lx + rx) / 2;
  81.         if(idx < m){
  82.             update(idx, val, 2 * ni + 1, lx, m);
  83.         }else{
  84.             update(idx, val, 2 * ni + 2, m, rx);
  85.         }
  86.         tree[ni] = merge(tree[2 * ni + 1], tree[2 * ni + 2]);
  87.     }
  88.  
  89.     void update(int idx, int val){
  90.         update(idx, val, 0, 0, seg_size);
  91.     }
  92.  
  93.     node query(int l, int r, int ni, int lx, int rx){
  94.         if(lx >= r || l >= rx) return node();
  95.         if(lx >= l && rx <= r) return tree[ni];
  96.         int m = (lx + rx) / 2;
  97.         node s1 = query(l, r, 2 * ni + 1, lx, m);
  98.         node s2 = query(l, r, 2 * ni + 2, m, rx);
  99.         return merge(s1, s2);
  100.     }
  101.  
  102.     node query(int l, int r){
  103.         return query(l, r, 0, 0, seg_size);
  104.     }
  105. };
  106.  
  107. vector < int > p , a;
  108. int n;
  109.  
  110. void makePer(int k) {
  111.     vector < int > vis(n, 0);
  112.     vector < int > res(n);
  113.  
  114.  
  115.     for (int i = 0; i < n; i++) {
  116.         if (!vis[i]) {
  117.             vector < int > cycle;
  118.  
  119.             int curr = i;
  120.  
  121.             while (!vis[curr]) {
  122.                 vis[curr] = 1;
  123.                 cycle.push_back(curr);
  124.                 curr = p[curr] - 1;
  125.             }
  126.  
  127.  
  128.             int x = sz(cycle);
  129.             // cout << "cycle: " <<cycle << nl;
  130.             k %= x;
  131.  
  132.  
  133.             for (int j = 0; j < x ; j++) {
  134.                 res[cycle[j]] = a[cycle[(j + k) % x]];
  135.             }
  136.         }
  137.     }
  138.  
  139.     a = res;
  140. }
  141.  
  142. void solve() {
  143.     cin >> n;
  144.     p.resize(n);
  145.     a.resize(n);
  146.  
  147.     cin >> a >> p;
  148.  
  149.     int q;
  150.     cin >> q;
  151.  
  152.     while(q--) {
  153.         int op;
  154.         cin >> op;
  155.  
  156.  
  157.         if(op == 1) {
  158.             ll k;
  159.             cin >> k;
  160.  
  161.             makePer(k);
  162.  
  163.         }else if(op == 2) {
  164.             SegTree st(n);
  165.             st.build(a);
  166.  
  167.  
  168.             int m;
  169.             cin >> m;
  170.  
  171.             while(m--) {
  172.                 int l, r;
  173.                 cin >> l >> r;
  174.                 l--;
  175.                 // cout << a << nl;
  176.                 node res = st.query(l, r);
  177.                 cout << res.mini << nl;
  178.             }
  179.         }
  180.     }
  181. }
  182.  
  183. int main() {
  184.     Sira();
  185.     int t = 1;
  186.     //    cin >> t;
  187.     while (t--) {
  188.         solve();
  189.     }
  190.     return 0;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement