제출 #337625

#제출 시각아이디문제언어결과실행 시간메모리
337625boykutSimple game (IZhO17_game)C++14
100 / 100
484 ms19584 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 1000010;

int mas[4 * N], be[4 * N];

void push(int v, int l, int r) {
   if (be[v]) {
      mas[v] += (r - l + 1) * be[v];
      if(l != r){
         be[v + v] += be[v];
         be[v + v + 1] += be[v];
      }
      be[v] = 0;
   }
}
int get(int v, int l, int r, int ql, int qr) {
   push(v, l, r);
   if (l > qr || r < ql)
      return 0;
   if (ql <= l && r <= qr)
      return mas[v];
   int mid = (l + r) / 2;
   return get(v + v, l, mid, ql, qr) + get(v + v + 1, mid + 1, r, ql, qr);
}
void update(int v, int l, int r, int ql, int qr, int val) {
   push(v, l, r);
   if(l > qr || r < ql)
      return;
   if (ql <= l && r <= qr) {
      mas[v] += (r-l+1)*val;
      if (l != r) {
         be[v + v] += val;
         be[v + v + 1] += val;
      }
      return;
   }
   int mid = (l + r) / 2; 
   update(v + v, l, mid, ql, qr, val);
   update(v + v + 1, mid + 1, r, ql, qr, val);
   mas[v] = mas[v + v] + mas[v + v + 1];
}

signed main() {
   ios::sync_with_stdio(0);
   cin.tie(0);
   
   int n, m;
   cin >> n >> m;
   
   int h[n];
   
   for (int i = 0; i < n; i++) {
      cin >> h[i];
      if (i) {
         int left = h[i], right = h[i - 1];
         if (left > right) swap(left, right);
         update(1, 1, N, left, right, 1);
      }
   }
   
   for (int test = m; test--;) {
      int x;
      cin >> x;
      
      if (x == 1) {
         int pos, val;
         cin >> pos >> val;
         pos--;
         
         auto inc = [&](int l, int r, int val) -> void{
            if (l > r) swap(l, r);
            update (1, 1, N, l, r, val);
         };
         
         if (pos) {
            inc(h[pos], h[pos - 1], -1);
         }
         if (pos + 1 < n) {
            inc(h[pos], h[pos + 1], -1);
         }
         
         h[pos] = val;
         
         if (pos) {
            inc(h[pos], h[pos - 1], 1);
         }
         if (pos + 1 < n) {
            inc(h[pos], h[pos + 1], 1);
         }
      } else {
         int H;
         cin >> H;
         cout << get(1, 1, N, H, H) << '\n';
      }
   }
   
   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...