제출 #334678

#제출 시각아이디문제언어결과실행 시간메모리
334678limabeansSimple game (IZhO17_game)C++17
100 / 100
438 ms65772 KiB
#include <bits/stdc++.h>
using namespace std;

template<typename T>
void out(T x) { cout << x << endl; exit(0); }
#define watch(x) cout << (#x) << " is " << (x) << endl





using ll = long long;


const int maxn = 1e6 + 5;

struct segtree {
    int n;
    vector<ll> t, o;
    void init(int _n) {
	n=_n+10;
	t.assign(4*n,0);
	o.assign(4*n,0);
    }

    void push(int v, int tl, int tr) {
	if (!o[v]) return;
	int tm=(tl+tr)/2;
	t[2*v] += 1ll*(tm-tl+1)*o[v];
	t[2*v+1] += 1ll*(tr-tm)*o[v];
	o[2*v] += o[v];
	o[2*v+1] += o[v];
	o[v] = 0;
    }

    ll qry(int v, int tl, int tr, int l, int r) {
	if (l>tr || r<tl) return 0;
	if (l<=tl && tr<=r) return t[v];
	push(v,tl,tr);
	int tm=(tl+tr)/2;
	return qry(2*v,tl,tm,l,r)+qry(2*v+1,tm+1,tr,l,r);
    }

    void upd(int v, int tl, int tr, int l, int r, ll dx) {
	if (l>tr || r<tl) return;
	if (l<=tl && tr<=r) {
	    t[v] += 1ll*(tr-tl+1)*dx;
	    o[v] += dx;
	} else {
	    push(v,tl,tr);
	    int tm=(tl+tr)/2;
	    upd(2*v,tl,tm,l,r,dx);
	    upd(2*v+1,tm+1,tr,l,r,dx);
	    t[v]=t[2*v]+t[2*v+1];
	}
    }
};

int n,q;
int a[maxn];

const int N = 1e6 + 10;
segtree tree;


void upd(int l, int r, int dx) {
    tree.upd(1,1,N,l,r,dx);
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);  cout.tie(0);

    cin>>n>>q;
    tree.init(N);

    for (int i=1; i<=n; i++) {
	cin>>a[i];
    }
    for (int i=1; i<n; i++) {
	int x = min(a[i],a[i+1]);
	int y = max(a[i],a[i+1]);
	upd(x,y,+1);
    }

    while (q--) {
	int op;
	cin>>op;
	if (op==1) {
	    int i,x;
	    cin>>i>>x;
	    if (i+1<=n) {
		upd(min(a[i],a[i+1]),max(a[i],a[i+1]),-1);
	    }
	    if (i-1>=1) {
		upd(min(a[i],a[i-1]),max(a[i],a[i-1]),-1);
	    }
	    a[i]=x;
	    if (i+1<=n) {
		upd(min(a[i],a[i+1]),max(a[i],a[i+1]),+1);
	    }
	    if (i-1>=1) {
		upd(min(a[i],a[i-1]),max(a[i],a[i-1]),+1);
	    }
	} else {
	    int h;
	    cin>>h;
	    cout<<tree.qry(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...