#include <iostream>
using namespace std;
int n, test, a[100010], node[4000010];
void update(int id, int x, int y, int l, int r, int val) {
	if (l > r) return;
	if ((l <= x) && (y <= r)) {
		node[id] += val;
		return;
	}
	if ((y < l) || (r < x)) return;
	int mid = (x+y)/2;
	node[id*2] += node[id];
	node[id*2+1] += node[id];
	node[id] = 0;
	update(id*2,x,mid,l,r,val);
	update(id*2+1,mid+1,y,l,r,val);
}
int query(int id, int x, int y, int pos) {
	if (x == y) return node[id];
	int mid = (x+y)/2;
	node[id*2] += node[id];
	node[id*2+1] += node[id];
	node[id] = 0;
	if (pos <= mid) return query(id*2,x,mid,pos);
	else return query(id*2+1,mid+1,y,pos);
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> test;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i < n; i++) update(1,1,1e6,min(a[i],a[i+1])+1,max(a[i],a[i+1])-1,1);
	while (test--) {
		int type, pos, val;
		cin >> type;
		if (type == 1) {
			cin >> pos >> val;
			if (pos != 1) update(1,1,1e6,min(a[pos-1],a[pos])+1,max(a[pos-1],a[pos])-1,-1);
			if (pos != n) update(1,1,1e6,min(a[pos+1],a[pos])+1,max(a[pos+1],a[pos])-1,-1);
			a[pos] = val;
			if (pos != 1) update(1,1,1e6,min(a[pos-1],a[pos])+1,max(a[pos-1],a[pos])-1,1);
			if (pos != n) update(1,1,1e6,min(a[pos+1],a[pos])+1,max(a[pos+1],a[pos])-1,1);
		} else {
			cin >> val;
			cout << query(1,1,1e6,val) << "\n";
		}
	}
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |