#include <bits/stdc++.h>
using namespace std;
const long long INF = 999999999999999999LL;
struct dat{
vector<int> lblockvals;
vector<int> lblockpos;
vector<int> lblocknum;
vector<long long> lblockpsum;
vector<int> rblockvals;
vector<int> rblockpos;
vector<int> rblocknum;
vector<long long> rblockpsum;
int numfin;
long long totsz;
int len;
dat(){
numfin = 0;
totsz = 0;
len = 0;
}
dat(int num){
numfin = 1;
totsz = num;
len = 1;
lblockpos.push_back(0);
lblocknum.push_back(0);
lblockvals.push_back(num);
lblockpsum.push_back(num);
rblockpos.push_back(0);
rblocknum.push_back(0);
rblockvals.push_back(num);
rblockpsum.push_back(num);
}
};
dat mer(dat a, dat b){
//printf("mer %d and %d\n",a.numfin,b.numfin);
dat ans = dat();
ans.totsz = a.totsz+b.totsz;
ans.len = a.len+b.len;
for (int x = 0; x<a.lblocknum.size(); x++){
ans.lblocknum.push_back(a.lblocknum[x]);
ans.lblockpos.push_back(a.lblockpos[x]);
ans.lblockvals.push_back(a.lblockvals[x]);
ans.lblockpsum.push_back(a.lblockpsum[x]);
//printf("lblock %d %d %d %d\n",a.lblocknum[x],a.lblockpos[x],a.lblockvals[x],a.lblockpsum[x]);
}
for (int x = 0; x<b.rblocknum.size(); x++){
ans.rblocknum.push_back(b.rblocknum[x]);
ans.rblockpos.push_back(b.rblockpos[x]);
ans.rblockvals.push_back(b.rblockvals[x]);
ans.rblockpsum.push_back(b.rblockpsum[x]);
//printf("rblock %d %d %d %d\n",b.rblocknum[x],b.rblockpos[x],b.rblockvals[x],b.rblockpsum[x]);
}
//printf("hi\n");
long long t1 = a.totsz;
int li,ri;
bool canfin = true;
for (int x = 0; x<b.lblocknum.size(); x++){
if (b.lblockvals[x]<=t1){
t1 += b.lblockpsum[x];
if (t1>INF) t1 = INF;
}
else{
li = ans.lblocknum.size();
canfin = false;
//assert(!ans.lblockpsum.empty());
ans.lblockpsum.back() += t1-a.totsz;
ans.lblockpos.push_back(b.lblockpos[x]+a.len);
ans.lblocknum.push_back(a.numfin);
ans.lblockvals.push_back(b.lblockvals[x]);
ans.lblockpsum.push_back(b.totsz-(t1-a.totsz));
break;
}
}
if (canfin){
ans.lblockpsum.back() += b.totsz;
ans.numfin += a.numfin;
}
t1 = b.totsz;
canfin = true;
for (int x = 0; x<a.rblocknum.size(); x++){
if (a.rblockvals[x]<=t1){
t1 += a.rblockpsum[x];
if (t1>INF) t1 = INF;
}
else{
ri = ans.rblocknum.size();
canfin = false;
//assert(!ans.rblockpsum.empty());
ans.rblockpsum.back() += t1-b.totsz;
ans.rblockpos.push_back(a.rblockpos[x]+b.len);
ans.rblocknum.push_back(b.numfin);
ans.rblockvals.push_back(a.rblockvals[x]);
ans.rblockpsum.push_back(a.totsz-(t1-b.totsz));
break;
}
}
if (canfin){
ans.rblockpsum.back() += a.totsz;
ans.numfin += b.numfin;
}
//printf("hi\n");
t1 = 0;
long long t2 = 0;
int maxv = 0;
long long sum1 = 0;
for (int x = 0; x<a.rblocknum.size(); x++){
sum1+= a.rblockpsum[x];
}
for (int x = 1; x<a.rblocknum.size(); x++){
//printf("arblock %d %d %d %d\n",a.rblocknum[x],a.rblockpos[x],a.rblockvals[x],a.rblockpsum[x]);
t1 += a.rblocknum[x];
t2 += a.rblockpsum[x-1];
sum1 -= a.rblockpsum[x-1];
t2 = min(t2,INF);
bool added = false;
while (maxv<b.lblocknum.size() && b.lblockvals[maxv]<=t2){
t2 += b.lblockpsum[maxv];
t2 = min(t2,INF);
maxv++;
added = true;
}
if (a.rblockvals[x]>t2){
if (maxv==b.lblocknum.size()){
if (ans.rblockpos.back()==b.len+a.rblockpos[x]){
ans.rblocknum.back()+=t1;
}
else{
ans.rblockpsum.back() -= sum1;
ans.rblockpos.push_back(b.len+a.rblockpos[x]);
ans.rblocknum.push_back(t1);
ans.rblockvals.push_back(a.rblockvals[x]);
ans.rblockpsum.push_back(sum1);
}
}
t1 = 0;
}
}
t2 += a.rblockpsum.back();
while (maxv<b.lblocknum.size() && b.lblockvals[maxv]<=t2){
t2 += b.lblockpsum[maxv];
t2 = min(t2,INF);
maxv++;
}
//printf("maxv = %d\n",maxv);
if (maxv==b.lblocknum.size()){
ans.numfin += t1;
}
else{
ans.lblocknum[li] += t1;
}
t1 = 0;
t2 = 0;
maxv = 0;
long long sum2 = 0;
for (int x = 0; x<b.lblocknum.size(); x++){
sum2 += b.lblockpsum[x];
}
for (int x = 1; x<b.lblocknum.size(); x++){
//printf("blblock %d %d %d %d\n",b.lblocknum[x],b.lblockpos[x],b.lblockvals[x],b.lblockpsum[x]);
t1 += b.lblocknum[x];
t2 += b.lblockpsum[x-1];
sum2 -= b.lblockpsum[x-1];
t2 = min(t2,INF);
bool added = false;
while (maxv<a.rblocknum.size() && a.rblockvals[maxv]<=t2){
t2 += a.rblockpsum[maxv];
t2 = min(t2,INF);
maxv++;
added = true;
}
if (b.lblockvals[x]>t2){
if (maxv==a.rblocknum.size()){
if (ans.lblockpos.back()==a.len+b.lblockpos[x]){
ans.lblocknum.back()+=t1;
}
else{
ans.lblockpsum.back() -= sum2;
ans.lblockpos.push_back(a.len+b.lblockpos[x]);
ans.lblocknum.push_back(t1);
ans.lblockvals.push_back(b.lblockvals[x]);
ans.lblockpsum.push_back(sum2);
}
}
t1 = 0;
}
}
t2 += b.lblockpsum.back();
while (maxv<a.rblocknum.size() && a.rblockvals[maxv]<=t2){
t2 += a.rblockpsum[maxv];
t2 = min(t2,INF);
maxv++;
}
if (maxv==a.rblocknum.size()){
ans.numfin += t1;
}
else{
ans.rblocknum[ri] += t1;
}
return ans;
}
int arr[100005];
struct node{
int s,e;
dat v;
node *l,*r;
node (int _s, int _e){
s = _s;
e = _e;
if (s==e){
v = dat(arr[s]);
}
else{
l = new node(s,(s+e)/2);
r = new node((s+e)/2+1,e);
v = mer(l->v,r->v);
//printf("node %d to %d has numfin %d\n",s,e,v.numfin);
}
}
dat qu(int a, int b){
//printf("node %d to %d, %d %d\n",s,e,a,b);
if (a<=s && e<=b){
return v;
}
if (b<=(s+e)/2){
return l->qu(a,b);
}
if (a>(s+e)/2){
return r->qu(a,b);
}
//printf("end %d %d\n",s,e);
return mer(l->qu(a,b),r->qu(a,b));
}
void upd(int pos){
if (s==e){
v = dat(arr[s]);
return;
}
if (pos<=(s+e)/2){
l->upd(pos);
}
else{
r->upd(pos);
}
v = mer(l->v,r->v);
}
}*root;
main(){
int n;
scanf("%d",&n);
for (int x = 1; x<=n; x++){
scanf("%d",&arr[x]);
}
root = new node(1,n);
int q;
scanf("%d",&q);
while (q--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if (a==1){
arr[b] = c;
root->upd(b);
}
else{
printf("%d\n",root->qu(b,c).numfin);
}
}
}