Submission #201173

#TimeUsernameProblemLanguageResultExecution timeMemory
201173quocnguyen1012Sterilizing Spray (JOI15_sterilizing)C++14
100 / 100
338 ms9592 KiB
#include <bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define pb push_back

using namespace std;
typedef long long ll;

const int maxn = 1e5 + 5;

struct node
{
  ll sum;
  int Max, pos;
  node(ll sum = 0, int Max = 0, int pos = 0):
    sum(sum), Max(Max), pos(pos) {}
  node operator + (const node & other) const
  {
    node res; res.sum = sum + other.sum;
    res.Max = max(Max, other.Max);
    res.pos = (Max < other.Max) ? other.pos : pos;
    return res;
  }
}ST[4 * maxn];
int N, Q, K;

#define lc id << 1
#define rc id << 1 | 1

void build(int id, int l, int r)
{
  if (l == r){
    ST[id].pos = l;
    return;
  }
  int mid = (l + r) / 2;
  build(lc, l, mid); build(rc, mid + 1, r);
}

void update(int id, int l, int r, int i, int val)
{
  if (r < i || l > i) return;
  if (l == r){
    ST[id].Max = ST[id].sum = val;
    return;
  }
  int mid = (l + r) / 2;
  update(lc, l, mid, i, val); update(rc, mid + 1, r, i, val);
  ST[id] = ST[lc] + ST[rc];
}

void rupd(int id, int l, int r ,int L, int R)
{
  if (l > R || L > r || ST[id].Max == 0){
    return;
  }
  if (l == r){
    ST[id].Max = ST[id].sum = ST[id].Max / K;
    return;
  }
  int mid = (l + r) / 2;
  rupd(lc, l, mid, L, R); rupd(rc, mid + 1, r, L, R);
  ST[id] = ST[lc] + ST[rc];
}

node query(int id, int l, int r, int L, int R)
{
  if (L <= l && r <= R){
    return ST[id];
  }
  if (L > r || l > R) return node(0, -1e9);
  int mid = (l + r) / 2;
  return query(lc, l, mid, L, R) + query(rc, mid + 1, r, L, R);
}
#undef lc
#undef rc

signed main(void)
{
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  if (fopen("A.INP", "r")){
    freopen("A.INP", "r", stdin);
    freopen("A.OUT", "w", stdout);
  }
  cin >> N >> Q >> K;
  build(1, 1, N);
  for (int i = 1; i <= N; ++i){
    int x; cin >> x;
    update(1, 1, N, i, x);
  }
  for (int i = 1; i <= Q; ++i){
    int type; cin >> type;
    if (type == 1){
      int pos, val; cin >> pos >> val;
      update(1 ,1, N, pos, val);
    }
    else if (type == 2){
      int l, r; cin >> l >> r;
      if (K != 1) rupd(1, 1, N, l, r);
    }
    else{
      int l, r; cin >> l >> r;
      cout << query(1, 1, N, l, r).sum << '\n';
    }
  }
}

Compilation message (stderr)

sterilizing.cpp: In function 'int main()':
sterilizing.cpp:84:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     freopen("A.INP", "r", stdin);
     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:85:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     freopen("A.OUT", "w", stdout);
     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...