Submission #340211

#TimeUsernameProblemLanguageResultExecution timeMemory
340211SprdaloSimple game (IZhO17_game)C++17
0 / 100
5 ms4588 KiB
#include <bits/stdc++.h> using namespace std; #define int ll typedef long long ll; typedef long double ld; typedef pair<int, int> pi; typedef pair<ll, ll> pl; typedef vector<int> vi; typedef vector<ll> vl; typedef vector<double> vd; typedef vector<bool> vb; typedef vector<char> vc; typedef vector<string> vs; typedef vector<pi> vp; typedef vector<pl> vpl; template<int MAXN> struct segtr{ //To change the purpose of the segtree just redefine the operators struct node{ int x; node(int x = 0) : x(x) {} node& operator+= (const node& other){ x += other.x; return *this; } node operator+ (const node& other){ node tmp = *this; return tmp += other; } }; node a[2*MAXN]; //Initialize the array void init(){ for(int i = 1; i <= MAXN; ++i){ a[i+MAXN-1] = node{}; } for(int i = MAXN-1; i > 0; --i){ a[i] = a[2*i] + a[2*i+1]; } } //Sets the node and updates the tree void set(int pos, node val){ pos += MAXN-1; a[pos] = val; while(pos > 1){ pos /= 2; a[pos] = a[2*pos] + a[2*pos+1]; } } inline void add(int pos, node val){ //Just forwards to set set(pos, node{a[pos+MAXN-1]+val}); } //Gets the range query node get(int l, int r, int pos = 1, int rl = 1, int rr = MAXN){ if(r < rl || rr < l){ return node{}; } if(l <= rl && rr <= r){ return a[pos]; } int rm = (rl+rr)/2; return get(l, r, 2*pos, rl, rm) + get(l, r, 2*pos+1, rm+1, rr); } }; segtr<131072> drvo; void oduzmi(int a, int b){ //cout << "BRISI " << a << ' ' << b << endl; if (a > b) swap(a, b); drvo.add(a, -1); drvo.add(b+1, 1); } void dodaj(int a, int b){ //cout << "DODAJ " << a << ' ' << b << endl; if (a > b) swap(a, b); drvo.add(a,1); drvo.add(b,-1); } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cerr.tie(nullptr); drvo.init(); int n, m; cin >> n >> m; vi a(n+1); for (int i = 1; i <= n; ++i) cin >> a[i]; for (int i = 2; i <= n; ++i){ dodaj(a[i-1],a[i]); } for (int e = 0; e < m; ++e){ int z; cin >> z; if (z == 2){ int h; cin >> h; cout << drvo.get(1, h).x << '\n'; continue; } int pos, val; cin >> pos >> val; if (pos > 1) oduzmi(a[pos], a[pos-1]); if (pos < n) oduzmi(a[pos], a[pos+1]); a[pos] = val; if (pos > 1) dodaj(a[pos], a[pos-1]); if (pos < n) dodaj(a[pos], a[pos+1]); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...