Advertisement
willy108

paimon seg tree

Dec 29th, 2021
876
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.06 KB | None | 0 0
  1.  
  2. //misaka and rin will carry me to cm
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <utility>
  7. #include <cassert>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <array>
  11. #include <tuple>
  12.  
  13. #define ll long long
  14. #define lb long double
  15. #define sz(vec) ((int)(vec.size()))
  16. #define all(x) x.begin(), x.end()
  17.  
  18. #define LC(k) (2*(k) +1)
  19. #define RC(k) (2*(k) +2)
  20.  
  21. const lb eps = 1e-9;
  22. const ll mod = 1e9 + 7, ll_max = 1e18;
  23. //const ll mod = (1 << (23)) * 119 +1;
  24. const int MX = 5e4 +10, int_max = 0x3f3f3f3f;
  25.  
  26. using namespace std;
  27.  
  28. //i will learn from moo.
  29. /* Input */
  30. template<class T> void read(T &x) { cin >> x; }
  31. template<class H, class T> void read(pair<H, T> &p) { cin >> p.first >> p.second; }
  32. template<class T, size_t S> void read(array<T, S> &a) { for (T &i : a) read(i); }
  33. template<class T> void read(vector<T> &v) { for (T &i : v) read(i); }
  34.  
  35. template<class H, class... T> void read(H &h, T &...t) { read(h); read(t...); }
  36.  
  37. /* Output */
  38. template<class H, class T> ostream &operator<<(ostream &o, pair<H, T> &p) { o << p.first << " " << p.second; return o; }
  39. template<class T, size_t S> ostream &operator<<(ostream &o, array<T, S> &a) { string s; for (T i : a) o << s << i, s = " "; return o; }
  40. template<class T> ostream &operator<<(ostream &o, vector<T> &v) { string s; for (T i : v) o << s << i, s = " "; return o; }
  41.  
  42. template<class T> void write(T x) { cout << x; }
  43. template<class H, class... T> void write(const H &h, const T &...t) { write(h); write(t...); }
  44.  
  45. void print() { write('\n'); }
  46. template<class H, class... T> void print(const H &h, const T &...t) { write(h); if (sizeof...(t)) write(' '); print(t...); }
  47.  
  48. /* Misc */
  49. template <typename T> void ckmin(T &a, const T &b) { a = min(a, b); }
  50. template <typename T> void ckmax(T &a, const T &b) { a = max(a, b); }
  51.  
  52. ll sq(ll a){
  53.     return ((a%mod)*(a%mod))%mod;
  54. }
  55.  
  56. struct matrix{
  57.     unsigned arr[4][4];
  58.     int t;
  59.     matrix(){
  60.         t = 0;
  61.         memset(arr, 0, sizeof(arr));
  62.     }
  63.     matrix(int a){
  64.         //t = a;
  65.         t = 0;
  66.         memset(arr, 0, sizeof(arr));
  67.         for(int i = 0; i<4; i++) arr[i][i] = 1;
  68.         arr[0][1] = a;
  69.         arr[1][2] = arr[1][3] = (2*a)%mod;
  70.         arr[0][2] = arr[0][3] = sq(a);
  71.         arr[2][3] = 1;
  72.         /**
  73.          * 1 a a*a a*a
  74.          * 0 1 2*a 2*a
  75.          * 0 0 1   1
  76.          * 0 0 0   1
  77.         **/
  78.     }
  79.     matrix(int a, int b, int c, int d){
  80.         memset(arr, 0, sizeof(arr));
  81.         arr[0][0] = a;
  82.         arr[0][1] = b;
  83.         arr[0][2] = c;
  84.         arr[0][3] = d;
  85.     }
  86.     matrix operator*(const matrix& b) const{
  87.         if(b.t == 1) return *this;
  88.         if(t == 1) return b;
  89.         matrix c = matrix();
  90.         //int ttt[4];
  91.         for(int i = 0; i<4; i++){
  92.             //for(int j =0; j<4; j++) ttt[j] = arr[i][j];
  93.             for(int j = i; j<4; j++){
  94.                 for(int k = 0; k<=j; k++){
  95.                     (c.arr[i][j] += ((ll)arr[i][k]*(ll)b.arr[k][j])%mod);
  96.                 }
  97.             }
  98.         }
  99.         for(int i = 0; i<4; i++){
  100.             for(int j = i; j<4; j++){
  101.                 c.arr[i][j] %= mod;
  102.             }
  103.         }
  104.         return c;
  105.     }
  106.     matrix operator+(const matrix&b) const{
  107.         matrix c = matrix();
  108.         //for(int i = 0; i<4; i++){
  109.             for(int j = 0; j<4; j++){
  110.                 c.arr[0][j] = (arr[0][j]+b.arr[0][j])%mod;
  111.             }
  112.         //}
  113.         return c;
  114.     }
  115.     void pr(){
  116.         for(int i = 0; i<4; i++){
  117.             for(int j = 0; j<4; j++){
  118.                 write(arr[i][j], ' ');
  119.             }
  120.             print();
  121.         }
  122.     }
  123. } st[MX*4], tag[MX*4], dummy, emp;
  124.  
  125.  
  126.  
  127. void push(int k, int L, int R){
  128.     //if(R - L > 1){
  129.         tag[LC(k)] = tag[LC(k)] * tag[k];
  130.         st[LC(k)] = st[LC(k)] * tag[k];
  131.         tag[RC(k)] = tag[RC(k)] * tag[k];
  132.         st[RC(k)] = st[RC(k)] * tag[k];
  133.         //st[k] = st[k] * tag[k];
  134.         tag[k] = dummy;
  135.  
  136.     //}
  137. }
  138.  
  139. void U(int qL, int qR, const matrix& v, int k, int L, int R){
  140.     if(qR <= L || R <= qL || R <= L) return ;
  141.     if(qL <= L && R <= qR){
  142.         tag[k] = tag[k] * v;
  143.         st[k] = st[k] * v;
  144.         return ;
  145.     }
  146.     push(k, L, R);
  147.     int mid = (L + R)/2;
  148.     U(qL, qR, v, LC(k), L, mid);
  149.     U(qL, qR, v, RC(k), mid, R);
  150.     st[k] = st[LC(k)] + st[RC(k)];
  151.     //st[k] = (st[LC(k)] * tag[LC(k)]) + (st[RC(k)] * tag[RC(k)]);
  152.     //st[k].pr();
  153. }
  154.  
  155. ll S(int qL, int qR, int k, int L, int R){
  156.     if(qR <= L || R <= qL || R <= L) return 0;
  157.     if(qL <= L && R <= qR) return st[k].arr[0][3];
  158.  
  159.     push(k, L, R);
  160.     int mid = (L + R)/2;
  161.     return (S(qL, qR, LC(k), L, mid) + S(qL, qR, RC(k), mid, R))%mod;
  162. }
  163.  
  164. ll arr[MX], n, m, q, s = 1;
  165. ll ans[MX];
  166. vector<pair<int, pair<int, int>>> adj[MX], upp;
  167.  
  168. void build(){
  169.     dummy = matrix(0);
  170.     dummy.t = 1;
  171.     emp = matrix(0);
  172.     dummy.arr[2][3] = 0;
  173.     while(s <= n) s*=2;
  174.     for(int i = s - 1; i<s*2 -1; i++){
  175.         st[i] = matrix(1, arr[i-(s-1)], sq(arr[i-(s-1)]), sq(arr[i-(s-1)]));
  176.         tag[i] = dummy;
  177.     }
  178.     for(int i = s - 2; ~i; i--){
  179.         st[i] = st[LC(i)] + st[RC(i)];
  180.         tag[i] = dummy;
  181.         //st[i].pr();
  182.     }
  183. }
  184.  
  185. #define le second.first
  186. #define ri second.second
  187. #define val first
  188. #define abs(x) ((x) > 0 ? (x) : (-(x)))
  189. #define mt(a, b, c) make_pair(c, make_pair(a, b))
  190. void solve(){
  191.     read(n, m, q);
  192.     for(int i = 0; i<n; i++){
  193.         read(arr[i]);
  194.         (arr[i] += mod) %= mod;
  195.     }
  196.     build();
  197.     //[>*
  198.     for(int i = 0; i<m; i++){
  199.         int a, b, c; read(a, b, c);
  200.         (c += mod) %= mod;
  201.         upp.push_back(mt(a, b, c));
  202.     }
  203.     for(int i = 1; i<=q; i++){
  204.         int a, b, c, d; read(a, b, c, d);
  205.         if(c-1 >= 0) adj[c-1].push_back(mt(a, b, -i));
  206.         adj[d].push_back(mt(a, b, i));
  207.     }
  208.     for(int i = 0; i<=m; i++){
  209.         //print("update# ", i);
  210.         for(auto& e : adj[i]){
  211.             //print(e, S(e.le-1, e.ri, 0, 0, s), abs(e.val), e.val/abs(e.val), mod - ans[abs(e.val)]);
  212.             ans[abs(e.val)] += mod + (e.val/abs(e.val))*S(e.le-1, e.ri, 0, 0, s);
  213.         }
  214.  
  215.         if(i <m){
  216.             //print(upp[i]);
  217.             matrix v = matrix(upp[i].val);
  218.             //v.pr();
  219.             U(upp[i].le - 1, upp[i].ri, v, 0, 0, s);
  220.             U(0, upp[i].le-1, emp, 0, 0, s);
  221.             U(upp[i].ri, s, emp, 0, 0, s);
  222.         }
  223.     }
  224.     for(int i = 1; i<=q; i++){
  225.         print(ans[i]%mod);
  226.     }
  227.     //**/
  228.     /*8
  229.     while(q--){
  230.         int op, l, r; read(op, l, r);
  231.         if(op == 1){
  232.             int a; read(a);
  233.             matrix v = matrix(a);
  234.             v.pr();
  235.             dummy.pr();
  236.             U(l-1, r, v, 0, 0, s);
  237.             U(0, l-1, 0, 0, 0, s);
  238.             U(r+1, s, 0, 0, 0, s);
  239.         }else{
  240.             print(S(l-1, r, 0, 0, s));
  241.         }  
  242.     }
  243.     **/
  244. }
  245.  
  246. int main(){
  247.   cin.tie(0) -> sync_with_stdio(0);
  248.     int T = 1;
  249.     //cin >> T;
  250.   while(T--){
  251.         solve();
  252.     }
  253.     return 0;
  254. }
  255.  
  256.  
  257.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement