#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> a) {
	int n = a.size();
	auto cmp = [&a](int x, int y) -> bool {
		if(x==-1 || y==-1)
			return (x==-1?0:1);
		return make_pair(a[x],x) < make_pair(a[y],y);
	};
	int par[n], deg[n];
	memset(par,-1,sizeof(par));
	stack<int> st;
	for(int i=0;i<n;i++) {
		while(st.size() && cmp(st.top(),i)) {
			par[st.top()] = (cmp(par[st.top()],i)?par[st.top()]:i);
			st.pop();
		}
		if(st.size())
			par[i]=st.top();
		st.push(i);
	}
	memset(deg,0,sizeof(deg));
	for(int i=0;i<n;i++)
		if(~par[i])
			deg[par[i]]++;
	int ord[n], cnt = 0;
	long long sub[n];
	for(int i=0;i<n;i++)
		sub[i] = a[i];
	for(int i=0;i<n;i++)
		for(int j=i;!deg[j];j=par[j]) {
			if(par[j]==-1)
				break;
			ord[cnt++] = j;
			deg[par[j]]--;
			deg[j]--;
			sub[par[j]] += sub[j];
		}
	bool yey[n];
	for(int i=0;i<n;i++)
		yey[i] = (~par[i]?a[par[i]]<=sub[i]:1);
	while(cnt--)
		yey[ord[cnt]] = yey[ord[cnt]] && yey[par[ord[cnt]]];
	int ans = 0;
	for(int i=0;i<n;i++)
		ans += yey[i];
	return ans;
}
int main() {
	int n, q;
	cin >> n;
	vector<int> a(n);
	for(int i=0;i<n;i++)
		cin >> a[i];
	cin >> q;
	while(q--) {
		int t, y, x;
		cin >> t >> x >> y;
		if(t == 1)
			a[x-1] = y;
		else
			cout << solve(vector<int>(a.begin()+x-1,a.begin()+y)) << "\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... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |