Advertisement
Guest User

Untitled

a guest
Nov 16th, 2017
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #pragma comment(linker, "/STACK:25600000000000000000000000000000000")
  3. #define qq cout << "!!" << endl;
  4. #define ww cout << "??" << endl;
  5. #define rr return 0;
  6. #define nl cout << endl;
  7. #define pb push_back
  8. #define mk make_pair
  9. #define sqr(a) ((a) * (a))
  10. #define imp(a) fixed << setprecision(a)
  11. #define x first
  12. #define y second
  13. #define acmSqrt(a) __asm__ ("fsqrt" : "+t" (a));
  14.  
  15. using namespace std;
  16.  
  17. typedef long long ll;
  18. typedef unsigned long long ull;
  19. typedef long double ld;
  20. typedef pair<int, int> pp;
  21. typedef pair<double, double> point;
  22.  
  23. int n, z;
  24.  
  25.  
  26. struct node {
  27.     int s, a;
  28. };
  29.  
  30. int *A;
  31. node *tree;
  32.  
  33. inline void build(int k, int left, int right) {
  34.     if(left == right) {
  35.         tree[k].s = A[left];
  36.         tree[k].a = INT_MAX;
  37.         return;
  38.     }
  39.  
  40.     register int center = (left + right) / 2;
  41.  
  42.     build(k * 2, left, center);
  43.     build(k * 2 + 1, center + 1, right);
  44.  
  45.     tree[k].s = tree[k * 2].s + tree[k * 2 + 1].s;
  46.     tree[k].a = INT_MAX;
  47. }
  48.  
  49. inline void push(int k, int left, int center, int right) {
  50.     if(tree[k].a != INT_MAX) {
  51.         tree[k * 2].a = tree[k].a;
  52.         tree[k * 2 + 1].a = tree[k].a;
  53.  
  54.         tree[k * 2].s = (center - left + 1) * tree[k].a;
  55.         tree[k * 2 + 1].s = (right - center) * tree[k].a;
  56.  
  57.         tree[k].a = INT_MAX;
  58.     }
  59. }
  60.  
  61. inline void update(int k, int left, int right, int l, int r, int &a) {
  62.     if(l > r) {
  63.         return;
  64.     }
  65.  
  66.     if(left == l && r == right) {
  67.         tree[k].a = a;
  68.         tree[k].s = (r - l + 1) * a;
  69.         return;
  70.     }
  71.  
  72.     register int center = (left + right) / 2;
  73.  
  74.     push(k, left, center, right);
  75.  
  76.     update(k * 2, left, center, l, min(r, center), a);
  77.     update(k * 2 + 1, center + 1, right, max(l, center + 1), r, a);
  78.  
  79.     tree[k].s = tree[k * 2].s + tree[k * 2 + 1].s;
  80. }
  81.  
  82. ll query(int k, int left, int right, int l, int r) {
  83.     if(l > r) {
  84.         rr;
  85.     }
  86.  
  87.     if(left == l && right == r) {
  88.         return tree[k].s;
  89.     }
  90.  
  91.     register int center = (left + right) / 2;
  92.  
  93.     push(k, left, center, right);
  94.  
  95.     return query(k * 2, left, center, l, min(r, center)) +
  96.            query(k * 2 + 1, center + 1, right, max(l, center + 1), r);
  97. }
  98.  
  99. int main() {
  100.     ios_base::sync_with_stdio(0);
  101.     ios::sync_with_stdio(0);
  102.     cin.tie(0);
  103.     cout.tie(0);
  104.     freopen("input.txt", "r", stdin);
  105.     freopen("output.txt", "w", stdout);
  106.     cin >> n >> z;
  107.  
  108.     A = new int[n];
  109.     tree = new node[4 * n];
  110.  
  111.     for(register int i = 0; i < n; ++i) {
  112.         cin >> A[i];
  113.     }
  114.  
  115.     build(1, 0, n - 1);
  116.  
  117.     while(z--) {
  118.         register string s;
  119.         register int l, r;
  120.  
  121.         cin >> s >> l >> r;
  122.  
  123.         if(s == "?") {
  124.             cout << query(1, 0, n - 1, --l, --r) << endl;
  125.         }
  126.         else {
  127.             register int a;
  128.             cin >> a;
  129.             update(1, 0, n - 1, --l, --r, a);
  130.         }
  131.     }
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement