제출 #128065

#제출 시각아이디문제언어결과실행 시간메모리
128065mirbek01Sterilizing Spray (JOI15_sterilizing)C++11
100 / 100
336 ms7816 KiB
# include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 2;

int n, q, k, a[N];
long long t[N * 4], mx[N * 4];

void upd(int pos, int val, int v = 1, int tl = 1, int tr = n){
      if(tl == tr){
            t[v] = val;
            mx[v] = val;
      } else {
            int tm = (tl + tr) >> 1;
            if(pos <= tm)
                  upd(pos, val, v << 1, tl, tm);
            else
                  upd(pos, val, v << 1 | 1, tm + 1, tr);
            t[v] = t[v << 1] + t[v << 1 | 1];
            mx[v] = max(mx[v << 1], mx[v << 1 | 1]);
      }
}

void upd1(int l, int r, int v = 1, int tl = 1, int tr = n){
      if(l > tr || tl > r || mx[v] < 1)
            return ;
      if(tl == tr){
            t[v] = t[v] / k;
            mx[v] = t[v];
            return ;
      }
      int tm = (tl + tr) >> 1;
      upd1(l, r, v << 1, tl, tm);
      upd1(l, r, v << 1 | 1, tm + 1, tr);
      t[v] = t[v << 1] + t[v << 1 | 1];
      mx[v] = max(mx[v << 1], mx[v << 1 | 1]);
}

long long get(int l, int r, int v = 1, int tl = 1, int tr = n){
      if(l > tr || tl > r)
            return 0;
      if(l <= tl && tr <= r)
            return t[v];
      int tm = (tl + tr) >> 1;
      return get(l, r, v << 1, tl, tm) +
                  get(l, r, v << 1 | 1, tm + 1, tr);
}

int main(){
      cin >> n >> q >> k;

      for(int i = 1; i <= n; i ++){
            scanf("%d", a+i);
            upd(i, a[i]);
      }

      while(q --){
            int tp, l, r;
            scanf("%d %d %d", &tp, &l, &r);
            if(tp == 1)
                  upd(l, r);
            if(tp == 2 && k > 1)
                  upd1(l, r);
            if(tp == 3)
                  printf("%lld\n", get(l, r));
      }
}

컴파일 시 표준 에러 (stderr) 메시지

sterilizing.cpp: In function 'int main()':
sterilizing.cpp:54:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", a+i);
             ~~~~~^~~~~~~~~~~
sterilizing.cpp:60:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d %d %d", &tp, &l, &r);
             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...