Submission #1350000

#TimeUsernameProblemLanguageResultExecution timeMemory
1350000michael12Simple game (IZhO17_game)C++20
100 / 100
190 ms64368 KiB
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<numeric>
#include<string>
#include<stack>
#include<queue>
#include<string.h>
#include<array>
#include<climits>
#include<algorithm>
#include<cmath>
using namespace std;
#define ff first
#define ss second
#define int long long
#define pb push_back
const int maxn = 1000001;
#define endl '\n'

struct ST{
   int n;
   vector<int> tree;
   vector<int> lazy;
   ST(int size){
    n = size;
    tree.resize(4 * n);
    lazy.resize(4 * n);
   }
   void push(int node, int start, int end){
     if(lazy[node] != 0){
        tree[node] += (end - start + 1) * lazy[node];
        if(start != end){
            lazy[2 * node] += lazy[node];
            lazy[2 * node + 1] += lazy[node];
        }
        lazy[node] = 0;
     }
   }
   void update(int node, int start, int end, int l, int r, int val){
       push(node, start, end);
      if(start > r || end < l) return;
      if(start >= l && end <= r){
         lazy[node] += val;
         push(node, start, end);
         return;
      }
      int mid = (start + end) / 2;
      update(2 * node, start, mid, l, r, val);
      update(2 * node + 1, mid + 1, end, l, r, val);
      tree[node] = tree[2 * node] + tree[2 * node + 1];
   }
   int fi(int node, int start, int end, int l, int r){
       push(node, start, end);
       if(start > r || end < l) return 0;
       if(start >= l && end <= r) return tree[node];
       int mid = (start + end) / 2;
       int l1 = fi(2 * node, start, mid, l, r);
       int r1 = fi(2 * node + 1, mid + 1, end, l, r);
       return l1 + r1;
   }
   int sol(int node, int start, int end, int id){
      push(node, start, end);
      if(start == end){
        return tree[node];
      }
      else{
        int mid = (start + end) / 2;
        if(mid >= id){
            return sol(2 * node, start, mid, id);
        }
        else{
            return sol(2 * node + 1, mid + 1, end, id);
        }
      }
   }
};
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for(int i = 0; i < n; i++){
        cin >> a[i];
        a[i]--;
    }
    ST st(maxn);
    for(int i = 1; i < n; i++){
       st.update(1, 0, maxn - 1, min(a[i], a[i - 1]), max(a[i - 1], a[i]), 1);
    }
    while(m--){
        int u;
        cin >> u;
        if(u == 1){
            int q, w;
            cin >> q >> w;
            q--, w--;
            if(q > 0){
               st.update(1, 0, maxn - 1, min(a[q - 1], a[q]), max(a[q], a[q - 1]), -1);
               st.update(1, 0, maxn - 1, min(a[q - 1], w), max(a[q - 1], w), 1);
            }
            if(q < n - 1){
                st.update(1, 0, maxn - 1, min(a[q], a[q + 1]), max(a[q], a[q + 1]), -1);
                st.update(1, 0, maxn - 1, min(w, a[q + 1]), max(w, a[q + 1]), 1);
            }
            a[q] = w;
            // for(int i = 0; i < 10; i++){
            //     cout << st.sol(1, 0, maxn, i) << " ";
            // }
            // return 0;
            
        }
        else{
            int q;
            cin >> q;
            q--;
            cout << st.fi(1, 0, maxn - 1, q, q) << endl;
            
        }

    }
    

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...