水题 gcd可合并
#include<bits/stdc++.h>
const int N=200005;
using namespace std;
template<class T>
inline void read(T &x)
{
x=0;
static char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
}
struct Tree
{
int l,r,gcd;
}tree[4*N];
int n,val[N];
inline void pushup(int now)
{
tree[now].gcd=__gcd(tree[2*now].gcd,tree[2*now+1].gcd);
}
inline void build(int now,int l,int r)
{
tree[now].l=l; tree[now].r=r;
if(l==r)
{
tree[now].gcd=val[l];
return;
}
int m=(l+r)>>1;
build(2*now,l,m);
build(2*now+1,m+1,r);
pushup(now);
}
void update(int now,int k,int v)
{
if(tree[now].l==k&&tree[now].r==k)
{
tree[now].gcd=v;
return;
}
int m=(tree[now].l+tree[now].r)>>1;
if(k<=m) update(2*now,k,v);
else update(2*now+1,k,v);
pushup(now);
}
int query(int now,int l,int r)
{
if(l<=tree[now].l&&tree[now].r<=r) return tree[now].gcd;
int m=(tree[now].l+tree[now].r)>>1,ans=0;
if(l<=m) ans=__gcd(ans,query(2*now,l,r));
if(r>m) ans=__gcd(ans,query(2*now+1,l,r));
return ans;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) read(val[i]);
build(1,1,n);
int T;
cin>>T;
while(T--)
{
int l,r,x;
read(x); read(l); read(r);
if(x==0) cout<<query(1,l,r)<<'\n';
else update(1,l,r);
}
return 0;
}