#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define Fast_IO ios::sync_with_stdio(false);
#define DEBUG fprintf(stderr,"Running on Line %d in Function %s\n",__LINE__,__FUNCTION__)
//mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
#define fir first
#define sec second
#define mod 998244353
#define int long long
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
inline int read()
{
	char ch=getchar(); int nega=1; while(!isdigit(ch)) {if(ch=='-') nega=-1; ch=getchar();}
	int ans=0; while(isdigit(ch)) {ans=ans*10+ch-48;ch=getchar();}
	if(nega==-1) return -ans;
	return ans;
}
typedef pair<int,int> pii;
void print(vector<int> x){for(int i=0;i<(int)x.size();i++) printf("%lld%c",x[i]," \n"[i==(int)x.size()-1]);}
#define N 100005
int a[N],n,Q;
struct Node
{
	int pos,pre,cnt;
	Node(int a=0,int b=0,int c=0) {pos=a,pre=b,cnt=c;}
};
struct SMT
{
	#define ls (u<<1)
	#define rs (u<<1|1)
	#define mid ((l+r)/2)
	vector<Node> vl[N*4],vr[N*4];
	pair<vector<Node>,vector<Node>> merge(int l1,int r1,int l2,int r2,vector<Node> lpre,vector<Node> lsuf,vector<Node> rpre,vector<Node> rsuf)
	{
		vector<Node> pre,suf;
		pre=lpre,suf=rsuf;
		pre[(int)pre.size()-1].cnt=0;
		suf[(int)suf.size()-1].cnt=0;
		int lsum=pre.back().pre,rsum=suf.back().pre;
		if(lsum>=a[l2]) pre.pop_back();
		if(rsum>=a[r1]) suf.pop_back();
		for(auto [pos,_pre,cnt]:rpre)
		{
			if(pos==r2||(lsum+_pre<a[pos+1])) pre.eb(pos,_pre+lsum,0);
		}
		for(auto [pos,_pre,cnt]:lsuf)
		{
			if(pos==l1||(rsum+_pre<a[pos-1])) suf.eb(pos,_pre+rsum,0);
		}
		{ // get lsuf jumps
			vector<int> jmpr(lsuf.size()); int curpos=0;
			for(int i=0;i<(int)lsuf.size();i++)
			{
				auto [pos,pre,cnt]=lsuf[i];
				if(pre<a[r1+1]) {jmpr[i]=-1; continue;}
				while(curpos+1<(int)rpre.size())
				{
					if(pre+rpre[curpos].pre>=a[rpre[curpos].pos+1]) curpos++;
					else break;
				}
				jmpr[i]=curpos;
			}
			vector<int> tor(lsuf.size()),jmpl(lsuf.size());
			for(int i=(int)lsuf.size()-1;i>=0;i--)
			{
				auto [pos,pre,cnt]=lsuf[i];
				if(i==(int)lsuf.size()-1) tor[i]=jmpr[i],jmpl[i]=i;
				else
				{
					int v=pre;
					if(jmpr[i]!=-1) v+=rpre[jmpr[i]].pre;
					if(v>=a[pos-1]) tor[i]=tor[i+1],jmpl[i]=jmpl[i+1];
					else tor[i]=jmpr[i],jmpl[i]=i;
				}
			}
			curpos=(int)pre.size()-1;
			for(int i=(int)lsuf.size()-1;i>=0;i--)
			{
				if(jmpl[i]==(int)lsuf.size()-1)
				{
					int nedpos;
					if(tor[i]==-1) nedpos=r1;
					else nedpos=rpre[tor[i]].pos;
					while(pre[curpos].pos!=nedpos) curpos--;
					pre[curpos].cnt+=lsuf[i].cnt;
				}
			}
			curpos=(int)suf.size()-1;
			for(int i=(int)lsuf.size()-1;i>=0;i--)
			{
				if(tor[i]==(int)rpre.size()-1)
				{
					int nedpos=lsuf[jmpl[i]].pos;
					while(suf[curpos].pos!=nedpos) curpos--;
					suf[curpos].cnt+=lsuf[i].cnt;
				}
			}
			// if(l1==1&&r2==5)
			// {
				// printf("***\n");
				// print(tor),print(jmpl),print(jmpr);
				// for(auto [x,y,z]:suf) printf("%d %d %d\n",x,y,z);
			// }
		}
		{ // get rpre jumps
			vector<int> jmpl(rpre.size()); int curpos=0;
			for(int i=0;i<(int)rpre.size();i++)
			{
				auto [pos,pre,cnt]=rpre[i];
				if(pre<a[r1]) {jmpl[i]=-1; continue;}
				while(curpos+1<(int)lsuf.size())
				{
					if(pre+lsuf[curpos].pre>=a[lsuf[curpos].pos-1]) curpos++;
					else break;
				}
				jmpl[i]=curpos;
			}
			vector<int> tol(rpre.size()),jmpr(rpre.size());
			for(int i=(int)rpre.size()-1;i>=0;i--)
			{
				auto [pos,pre,cnt]=rpre[i];
				if(i==(int)rpre.size()-1) tol[i]=jmpl[i],jmpr[i]=i;
				else
				{
					int v=pre;
					if(jmpl[i]!=-1) v+=lsuf[jmpl[i]].pre;
					if(v>=a[pos+1]) tol[i]=tol[i+1],jmpr[i]=jmpr[i+1];
					else tol[i]=jmpl[i],jmpr[i]=i;
				}
			}
			curpos=(int)suf.size()-1;
			for(int i=(int)rpre.size()-1;i>=0;i--)
			{
				if(jmpr[i]==(int)rpre.size()-1)
				{
					int nedpos;
					if(tol[i]==-1) nedpos=l2;
					else nedpos=lsuf[tol[i]].pos;
					while(suf[curpos].pos!=nedpos) curpos--;
					suf[curpos].cnt+=rpre[i].cnt;
				}
			}
			curpos=(int)pre.size()-1;
			for(int i=(int)rpre.size()-1;i>=0;i--)
			{
				if(tol[i]==(int)lsuf.size()-1)
				{
					int nedpos=rpre[jmpr[i]].pos;
					while(pre[curpos].pos!=nedpos) curpos--;
					pre[curpos].cnt+=rpre[i].cnt;
				}
			}
		}
		return {pre,suf};
	}
	pair<vector<Node>,vector<Node>> getone(int pos)
	{
		vector<Node> v;
		v.eb(pos,a[pos],1);
		return {v,v};
	}
	void build(int u,int l,int r)
	{
		if(l==r)
		{
			tie(vl[u],vr[u])=getone(l);
			return ;
		}
		build(ls,l,mid),build(rs,mid+1,r);
		tie(vl[u],vr[u])=merge(l,mid,mid+1,r,vl[ls],vr[ls],vl[rs],vr[rs]);
		// printf("^ %d %d %d :\n",u,l,r);
		// for(auto [x,y,z]:vl[u]) printf("%d %d %d\n",x,y,z);
		// cout<<"\n";
		// for(auto [x,y,z]:vr[u]) printf("%d %d %d\n",x,y,z);
		// cout<<"\n";
	}
	void update(int u,int l,int r,int pos)
	{
		if(l==r)
		{
			tie(vl[u],vr[u])=getone(l);
			return ;
		}
		if(pos<=mid) update(ls,l,mid,pos);
		else update(rs,mid+1,r,pos);
		tie(vl[u],vr[u])=merge(l,mid,mid+1,r,vl[ls],vr[ls],vl[rs],vr[rs]);
	}
	pair<vector<Node>,vector<Node>> query(int u,int l,int r,int L,int R)
	{
		if(L==l&&r==R) return {vl[u],vr[u]};
		if(mid>=L&&mid<R)
		{
			auto [lpre,lsuf]=query(ls,l,mid,max(l,L),min(mid,R));
			auto [rpre,rsuf]=query(rs,mid+1,r,max(mid+1,L),min(r,R));
			return merge(L,mid,mid+1,R,lpre,lsuf,rpre,rsuf);
		}
		else if(mid>=L) return query(ls,l,mid,max(l,L),min(mid,R));
		else if(mid<R) return query(rs,mid+1,r,max(mid+1,L),min(r,R));
		else assert(0);
	}
}smt;
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++) a[i]=read();
	smt.build(1,1,n);
	cin>>Q;
	while(Q--)
	{
		int op=read(),l=read(),r=read();
		if(op==1) a[l]=r,smt.update(1,1,n,l);
		else
		{
			auto [pre,suf]=smt.query(1,1,n,l,r);
			printf("%d\n",suf.back().cnt);
		}
	}
	return 0;
}

