답안 #83329

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
83329 2018-11-07T03:18:23 Z Nordway Simple game (IZhO17_game) C++14
100 / 100
584 ms 35196 KB
#include<bits/stdc++.h>
#define x first
#define y second
#define pb push_back
#define mp make_pair
#define up_b upper_bound
#define low_b lower_bound
#define sz(x) (int)x.size()
#define all(v) v.begin(),v.end()
#define boost ios_base::sync_with_stdio(0),cin.tie(0),cout.tie()

using namespace std;

typedef unsigned long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
typedef pair<ll,ll> pll;

const ll INF = 1e18;
const int inf = INT_MAX;
const ll mod = 1e9 + 7;
const int pi = acos(-1);
const int dx[4] = {0, 1, 0, 0};
const int dy[4] = {1, 0, 0, 0};
const int N = 1e5 + 5;
const int MAXN = 1e6 + 1;
int t[4 * MAXN], a[N], z[4 * MAXN];

void push(int v, int tl, int tr){
	if(z[v]){
		if(tl != tr){
			z[v * 2] += z[v];
			z[v * 2 + 1] += z[v];
		}
		t[v] += z[v];
		z[v] = 0;
	}
}

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

int get(int v, int tl, int tr, int pos){
	push(v, tl, tr);
	if(tl == tr)return t[v];
	int tm = (tl + tr) / 2;
	if(pos <= tm)return get(v * 2, tl, tm, pos);
	else return get(v * 2 + 1, tm + 1, tr, pos);
}

int main(){
	//freopen("game.in", "r", stdin);
	//freopen("game.out", "w", stdout);
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		if(i > 1){
			upd(1, 1, 1e6, min(a[i], a[i - 1]), max(a[i], a[i - 1]), 1);
		}
	}
	while(m--){
		int type, h, pos, val;
		cin >> type;
		if(type == 1){
			cin >> pos >> val;
			if(pos != 1)upd(1, 1, 1e6, min(a[pos], a[pos - 1]), max(a[pos], a[pos - 1]), -1);
			if(pos != n)upd(1, 1, 1e6, min(a[pos], a[pos + 1]), max(a[pos], a[pos + 1]), -1);
			a[pos] = val;
			if(pos != 1)upd(1, 1, 1e6, min(a[pos], a[pos - 1]), max(a[pos], a[pos - 1]), 1);
			if(pos != n)upd(1, 1, 1e6, min(a[pos], a[pos + 1]), max(a[pos], a[pos + 1]), 1);
		}
		else{
			cin >> h;
			cout << get(1, 1, 1e6, h) << endl;
		}
	}
	
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 376 KB Output is correct
2 Correct 18 ms 15116 KB Output is correct
3 Correct 24 ms 15116 KB Output is correct
4 Correct 18 ms 15116 KB Output is correct
5 Correct 18 ms 15268 KB Output is correct
6 Correct 18 ms 15292 KB Output is correct
7 Correct 16 ms 15292 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 376 KB Output is correct
2 Correct 18 ms 15116 KB Output is correct
3 Correct 24 ms 15116 KB Output is correct
4 Correct 18 ms 15116 KB Output is correct
5 Correct 18 ms 15268 KB Output is correct
6 Correct 18 ms 15292 KB Output is correct
7 Correct 16 ms 15292 KB Output is correct
8 Correct 269 ms 15292 KB Output is correct
9 Correct 460 ms 20624 KB Output is correct
10 Correct 433 ms 22416 KB Output is correct
11 Correct 264 ms 22416 KB Output is correct
12 Correct 336 ms 22416 KB Output is correct
13 Correct 342 ms 25900 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 376 KB Output is correct
2 Correct 18 ms 15116 KB Output is correct
3 Correct 24 ms 15116 KB Output is correct
4 Correct 18 ms 15116 KB Output is correct
5 Correct 18 ms 15268 KB Output is correct
6 Correct 18 ms 15292 KB Output is correct
7 Correct 16 ms 15292 KB Output is correct
8 Correct 269 ms 15292 KB Output is correct
9 Correct 460 ms 20624 KB Output is correct
10 Correct 433 ms 22416 KB Output is correct
11 Correct 264 ms 22416 KB Output is correct
12 Correct 336 ms 22416 KB Output is correct
13 Correct 342 ms 25900 KB Output is correct
14 Correct 546 ms 27452 KB Output is correct
15 Correct 584 ms 29292 KB Output is correct
16 Correct 546 ms 31336 KB Output is correct
17 Correct 567 ms 33344 KB Output is correct
18 Correct 561 ms 35196 KB Output is correct