hpnq

a way to РЭ 0 баллов

Jan 21st, 2023
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.18 KB | None | 0 0
  1. struct sgt{
  2.     vector<ll> t;
  3.     int d;
  4.     void merge(int i){
  5.         t[i] = t[2*i+1] + t[2*i];
  6.     }
  7.     sgt(vector<ll> a){
  8.         int k = 1;
  9.         int n = sz(a);
  10.         while(k<= n){
  11.             k*=2;
  12.         }
  13.         t.resize(2*k);
  14.         d = k;
  15.         loop(i, d, d+n){
  16.             t[i] = a[i-d];
  17.         }
  18.         for(int i = d-1; i >0; i--){
  19.             merge(i);
  20.         }
  21.     }
  22.     ll query(int l, int r, int ls, int rs, int v){
  23.         if(ls > r || rs < l){
  24.             return 0;
  25.         }
  26.         if(ls >= l && rs <= r){
  27. //            cout << ls << " " << rs << " " << l << " " << r << " " << v << endl;
  28.             return t[v];
  29.         }
  30.         int m = (ls+rs)/2;
  31.         return query(l, r, ls, m, 2*v) + query(l, r, m+1, rs, 2*v+1);
  32.     }
  33.  
  34.  
  35.     ll query(int l, int r){
  36.         return query(l, r, 0, d-1, 1);
  37.     }
  38.  
  39.     void upd(int l, int r, int i, int x, int v){
  40.         if(l == r){
  41.             t[v] = x;
  42.             return;
  43.         }
  44.         int m = (l+r)/2;
  45.         if(i <= m){
  46.             upd(l, m, i, x, 2*v);
  47.         }else{
  48.             upd(m+1, r, i, x, 2*v + 1);
  49.         }
  50.         merge(v);
  51.     }
  52.     void upd(int i, int x){
  53.         upd(0, d-1, i, x, 1);
  54.     }
  55. };
  56. void segment() {
  57.     int n, m;
  58.     cin >> n >> m;
  59.     vector<ll> a(n);
  60.     loop(i, 0, n) cin >> a[i];
  61.     sgt s(a);
  62.     loop(i, 0, m){
  63.         int type;
  64.         cin >> type;
  65.         if(type == 1){
  66.             int dd1, x;
  67.             cin >> dd1 >> x;
  68.             s.upd(dd1, x);
  69.         }else{
  70.             int l, r;
  71.             cin >> l >> r;
  72.             r-=1;
  73.             cout << s.query(l, r) << '\n';
  74.         }
  75.     }
  76. }
  77.  
  78. int fastpow(int a, int n, int prime){
  79.     // a^n = a
  80.     if(n == 1){
  81.         return a;
  82.     }
  83.     if(n%2 == 0){
  84.         int x = fastpow(a, n/2, prime);
  85.         return (x*x) % prime;
  86.     }
  87.     return (fastpow(a, n-1, prime) * a) % prime;
  88. }
  89. int fastpow_binary(int a, int n, int prime){
  90.     int res = 1;
  91.     while(n){
  92.         if(n&1) res = res*a % prime;
  93.         a = a*a % prime;
  94.         n>>=1;
  95.     }
  96.     return res;
  97.  
  98. }
  99. vector<int> fact;
  100. int rev(int a, int p){
  101.     int ans = fastpow_binary(a, p-2, p);
  102.     return ans;
  103. }
  104.  
  105. int cnk(int n, int k, int p){
  106.     return fact[n] * rev(fact[k], p ) % p * rev(fact[n-k], p) % p;
  107. }
  108. void solve_cnk(){
  109.     int n, k , p = 13;
  110.     cin >> n >> k;
  111.     fact.resize(n+1);
  112.     fact[1] = 1;
  113.     loop(i, 2, n+1){
  114.         fact[i] = fact[i-1] * i % p;
  115.     }
  116.     cout << cnk(n, k, p);
  117. }
  118.  
  119.  
  120. struct bridges{
  121.     vector<vector<int>> g;
  122.     vector<int> used;
  123.     vector<int> h, d;
  124.  
  125.     void dfs(int v, int p = -1){
  126.         used[v] = 1;
  127.         d[v] = h[v] = (p == -1 ? 0 : h[p]+1);
  128.         for(auto to : g[v]){
  129.             if(p != to){
  130.                 if(used[to]){
  131.                     d[v] = min(d[v], h[to]);
  132.                 }else{
  133.                     dfs(to, v);
  134.                     d[v] = min(d[v], d[to]);
  135.                     if(h[v] < d[to]){
  136.                         // мост
  137.                     }
  138.                 }
  139.             }
  140.         }
  141.     }
  142.  
  143.     bridges(int n, int m){
  144.         g.resize(n);
  145.         used.resize(n);
  146.         h.resize(n); // прямые ребра
  147.         d.resize(n); // обратные ребра
  148.         loop(i, 0, m){
  149.             int a, b;
  150.             cin >> a >> b;
  151.             a--, b--;
  152.             g[a].pb(b);
  153.             g[b].pb(a);
  154.         }
  155.  
  156.  
  157.     }
  158. };
  159.  
  160. struct topsort{
  161.     vector<vector<int>> g;
  162.     vector<int> used;
  163.     vector<int> tp;
  164.     void dfs(int v, int p = -1){
  165.         used[v] = 1;
  166.         for(auto to : g[v]){
  167.             if(!used[to]){
  168.                 dfs(to);
  169.             }
  170.         }
  171.         tp.pb(v);
  172.     }
  173.  
  174.     topsort(int n, int m){
  175.         g.resize(n);
  176.         used.resize(n);
  177.         loop(i, 0, m){
  178.             int a, b;
  179.             cin >> a >> b;
  180.             a--, b--;
  181.             g[a].pb(b);
  182. //            g[b].pb(a);
  183.         }
  184.         loop(i, 0, n){
  185.             if(!used[i]){
  186.                 dfs(i);
  187.             }
  188.         }
  189.         reverse(all(tp));
  190.         for(auto i : tp){
  191.             cout << i << " ";
  192.         }
  193.  
  194.     }
  195. };
  196.  
  197. struct dvudol{
  198.     vector<vector<int>> g;
  199.     vector<int> used;
  200.     int rev_cl(int c){
  201.         return (c==1 ? 2 : 1);
  202.     }
  203.     void dfs(int v, int c = 1, int p =-1){
  204.         used[v] = c;
  205.         for(auto to : g[v]){
  206.             if(p == to){
  207.                 continue;
  208.             }
  209.             if(!used[to]){
  210.                 dfs(to, rev_cl(c), v);
  211.             }else{
  212. //                cout <<used[to] << endl;
  213.                 if(used[to] == c){
  214.                     cout << "nedvudol";
  215.                     exit(0);
  216.                 }
  217.             }
  218.         }
  219.     }
  220.  
  221.     dvudol(int n, int m){
  222.         g.resize(n);
  223.         used.resize(n);
  224.         loop(i, 0, m){
  225.             int a, b;
  226.             cin >> a >> b;
  227.             a--, b--;
  228.             g[a].pb(b);
  229.             g[b].pb(a);
  230.         }
  231.         loop(i, 0, n){
  232.             if(!used[i]){
  233.                 dfs(i);
  234.             }
  235.         }
  236.         cout << "dvudol";
  237.  
  238.  
  239.     }
  240. };
  241.  
  242. // хранить только одну долю?
  243. struct parsoh{
  244.     vector<vector<int>> g;
  245.     vector<int> used;
  246.     vector<int> mt;
  247.     bool dfs(int v){
  248.         if(used[v]){
  249.             return false;
  250.         }
  251.         used[v] = true;
  252.         for(auto to : g[v]){
  253.             if(mt[to] == -1 || dfs(to)){
  254.                 mt[to] = v;
  255.                 return true;
  256.             }
  257.         }
  258.         return false;
  259.     }
  260.  
  261.     parsoh(int n, int m){
  262.         g.resize(n);
  263.         used.resize(n);
  264.         mt.resize(n, -1);
  265.         loop(i, 0, m){
  266.             int a, b;
  267.             cin >> a >> b;
  268.             a--, b--;
  269.             g[a].pb(b);
  270.             g[b].pb(a);
  271.         }
  272.         int cnt = 0;
  273.         loop(i, 0, n){
  274.             used.assign(n, 0);
  275.             if(dfs(i)){
  276.                 cnt++;
  277.             }
  278.         }
  279.  
  280.  
  281.  
  282.     }
  283. };
  284.  
  285. struct djikstramlogn{
  286.     vector<vector<pair<int, int>>>g;
  287.     int n;
  288.  
  289.     vector<int> start(int s){
  290.         vector<int> d(n, inf);
  291.         d[s] = 0;
  292.         set<pair<int, int>> st;
  293.         st.insert({0, s});
  294.         while(!st.empty()){
  295.             int v = st.begin()->second;
  296.             st.erase(st.begin());
  297.             for(auto [to, w] : g[v]){
  298.                 if(d[to] > d[v] + w){
  299.                     st.erase({d[to], to});
  300.                     d[to] = d[v] + w;
  301.                     st.insert({d[to], to});
  302.                 }
  303.             }
  304.         }
  305.         return d;
  306.     }
  307. };
  308. struct djikstran2{
  309.     vector<vector<pair<int, int>>>g;
  310.     int n;
  311.  
  312.     vector<int> start(int s){
  313.         vector<int> d(n, inf), a(n, 0);
  314.         d[s] = 0;
  315.         lp(n){
  316.             int v = -1;
  317.             loop(to, 0, n){
  318.                 if(!a[to] && (v == -1 || d[v] > d[to])){
  319.                     v = to;
  320.                 }
  321.             }
  322.  
  323.             a[v] = 1;
  324.             for(auto [to, w] : g[v]){
  325.                 d[to] = min(d[to], d[v] + w);
  326.             }
  327.         }
  328.         return d;
  329.     }
  330. };
  331.  
  332. struct hsh{
  333.     vector<ll> h;
  334.     vector<ll> pw;
  335.     ll mod, k;
  336.     ll sum(ll a, ll b){
  337.         return (a%mod + b%mod) %mod;
  338.     }
  339.     ll sub(ll a, ll b){
  340.         return (a%mod - b%mod+ mod )%mod;
  341.     }
  342.     ll mul(ll a, ll b){
  343.         return (a%mod * b%mod) %mod;
  344.     }
  345.     hsh(string& a, ll md, ll l){
  346.         int n= sz(a);
  347.         mod = md;
  348.         k = l;
  349.         h.resize(sz(a));
  350.         pw.resize(sz(a), 1);
  351.         pw[1] = k;
  352.         loop(i, 2, n){
  353.             pw[i] = mul(pw[i-1], k);
  354.         }
  355.         h[0] = a[0];
  356.         loop(i, 1, n){
  357.             h[i] = sum(mul(h[i-1], k), a[i]);
  358.         }
  359.     }
  360.     ll substr(ll l, ll r){
  361.         if(l == 0){
  362.             return h[r];
  363.         }
  364.         return sub(h[r], mul(h[l-1], pw[r-l+1]));
  365.  
  366.     }
  367. };
  368. vector<int> slow_zf(string s){
  369.     int n = sz(s);
  370.     vector<int> z(n, 0);
  371.     int l = 0;
  372.     int r = 0;
  373.     for(int i = 1; i < n; i++){
  374.  
  375.         if(i <=r){
  376.             z[i] = min(z[i-l], r-i+1);
  377.         }
  378.         while(i+z[i] < n && s[z[i]] == s[i + z[i]]){
  379.             z[i]++;
  380.         }
  381.         if (i + z[i] - 1 > r) {
  382.             r = i + z[i] - 1;
  383.             l = i;
  384.         }
  385.     }
  386.  
  387.     return z;
  388. }
Advertisement
Add Comment
Please, Sign In to add comment