Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include <vector>
  2.  
  3. typedef long long ll;
  4.  
  5. using namespace std;
  6.  
  7. int MOD;
  8. vector < ll > st, pot10;
  9. string num;
  10.  
  11. int left(const int &x){ return (x << 1); }
  12. int right(const int &x){ return ((x << 1) + 1); }
  13. int padre(const int &x){ return (x >> 1); }
  14.  
  15. void calcularPot10()
  16. {
  17.     pot10.push_back(1 % MOD);
  18.  
  19.     for(int i = 1; i < 300010; i++)
  20.         pot10.push_back((((pot10.back() % MOD) * (10 % MOD)) % MOD));
  21. }
  22.  
  23. int cantDigitos(int L, int R){ return ((R - (((L + R) / 2) + 1)) + 1); }
  24.  
  25. void build(int p, int L, int R)
  26. {
  27.     if(L == R)
  28.     {
  29.         st[p] = (num[L] - '0');
  30.  
  31.         return;
  32.     }
  33.  
  34.     build(left(p), L, ((L + R) / 2));
  35.     build(right(p), (((L + R) / 2) + 1), R);
  36.  
  37.     ll r1 = st[left(p)], r2 = st[right(p)];
  38.  
  39.     st[p] = (((((r1 % MOD) * (pot10[cantDigitos(L, R)] % MOD)) % MOD) + (r2 % MOD)) % MOD);
  40. }
  41.  
  42. int query(int p, int L, int R, int i, int j)
  43. {
  44.     if((L > j) || (R < i))
  45.         return (-1);
  46.     if((L >= i) && (R <= j))
  47.         return (st[p] % MOD);
  48.  
  49.     ll r1 = query(left(p), L, ((L + R) / 2), i, j);
  50.     ll r2 = query(right(p), (((L + R) / 2) + 1), R, i, j);
  51.  
  52.     if(r1 == (-1))
  53.         return r2;
  54.     if(r2 == (-1))
  55.         return r1;
  56.  
  57.     return (((((r1 % MOD) * (pot10[(min(j, R) - (((L + R) / 2) + 1)) + 1] % MOD)) % MOD) + (r2 % MOD)) % MOD);
  58. }
  59.  
  60. void update(int p, int L, int R, int ind, int val)
  61. {
  62.     if((L > ind) || (R < ind))
  63.         return;
  64.     if((L == ind) && (R == ind))
  65.     {
  66.         st[p] = val;
  67.  
  68.         return;
  69.     }
  70.  
  71.     update(left(p), L, ((L + R) / 2), ind, val);
  72.     update(right(p), (((L + R) / 2) + 1), R, ind, val);
  73.  
  74.     ll r1 = st[left(p)], r2 = st[right(p)];
  75.  
  76.     st[p] = (((((r1 % MOD) * (pot10[cantDigitos(L, R)] % MOD)) % MOD) + (r2 % MOD)) % MOD);
  77. }
  78.  
  79. vector < int > dominando(string n, int d, vector < int > t, vector < int > a, vector < int > b)
  80. {
  81.     int Q = (int)t.size();
  82.     int sz = (int)n.size();
  83.     vector < int > r;
  84.     num = (" " + n);
  85.     MOD = d;
  86.     calcularPot10();
  87.  
  88.     st = vector < ll >(((sz * 4) + 10), 0);
  89.  
  90.     build(1, 1, sz);
  91.  
  92.     for(int i = 0; i < Q; i++)
  93.     {
  94.         if(!t[i])
  95.         {
  96.             r.push_back(query(1, 1, sz, a[i], b[i]));
  97.         }
  98.         else
  99.         {
  100.             update(1, 1, sz, a[i], b[i]);
  101.         }
  102.     }
  103.  
  104.     return r;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement