Submission #132491

#TimeUsernameProblemLanguageResultExecution timeMemory
132491Just_Solve_The_ProblemSterilizing Spray (JOI15_sterilizing)C++11
100 / 100
305 ms6904 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int N = (int)1e5 + 7;

int a[N];
int n, q, k;

struct T {
  ll tree[4 * N];
  int mx[4 * N];
  T() {}
  void build(int v = 1, int l = 1, int r = n) {
    if (l == r) {
      tree[v] = mx[v] = a[l];
      return ;
    }
    int mid = (l + r) >> 1;
    build(v + v, l, mid);
    build(v + v + 1, mid + 1, r);
    tree[v] = tree[v + v] + tree[v + v + 1];
    mx[v] = max(mx[v + v], mx[v + v + 1]);
  }
  void upd(int l, int r, int v = 1, int tl = 1, int tr = n) {
    if (tl > r || tr < l || mx[v] == 0) return ;
    if (tl == tr) {
      tree[v] /= k;
      mx[v] /= k;
      return ;
    }
    int mid = (tl + tr) >> 1;
    upd(l, r, v + v, tl, mid);
    upd(l, r, v + v + 1, mid + 1, tr);
    tree[v] = tree[v + v] + tree[v + v + 1];
    mx[v] = max(mx[v + v], mx[v + v + 1]);
  }
  void updpos(int pos, int val, int v = 1, int tl = 1, int tr = n) {
    if (tl == tr) {
      tree[v] = mx[v] = val;
      return ;
    }
    int mid = (tl + tr) >> 1;
    if (pos <= mid) {
      updpos(pos, val, v + v, tl, mid);
    } else {
      updpos(pos, val, v + v + 1, mid + 1, tr);
    }
    tree[v] = tree[v + v] + tree[v + v + 1];
    mx[v] = max(mx[v + v], mx[v + v + 1]);
  }
  ll get(int l, int r, int v = 1, int tl = 1, int tr = n) {
    if (tl > r || tr < l) return 0;
    if (l <= tl && tr <= r) return tree[v];
    int mid = (tl + tr) >> 1;
    return get(l, r, v + v, tl, mid) + get(l, r, v + v + 1, mid + 1, tr);
  }
};
T tr;

main() {
  scanf("%d %d %d", &n, &q, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  tr.build();
  while (q--) {
    int s, t, u;
    scanf("%d %d %d", &s, &t, &u);
    if (s == 1) {
      tr.updpos(t, u);
    } else if (s == 2) {
      if (k == 1) continue;
      tr.upd(t, u);
    } else {
      printf("%lld\n", tr.get(t, u));
    }
  }
}

Compilation message (stderr)

sterilizing.cpp:63:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main() {
      ^
sterilizing.cpp: In function 'int main()':
sterilizing.cpp:64:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d", &n, &q, &k);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:66:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &a[i]);
     ~~~~~^~~~~~~~~~~~~
sterilizing.cpp:71:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &s, &t, &u);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...