Пример #1
0
int query(int a, int b, int N)
{
  if (b - a >= 11)
    return query_seg(root, a, b, 0, N - 1);
  int d = seq[a], i;
  for (i = a + 1; i <= b; i++)
    d = gcd(d, seq[i]);
  return d;
}
Пример #2
0
int query_seg(node* cur, int bl, int br, int l, int r)
{
  if (br < l || bl > r)
    return 0;
  if (bl <= l && br >= r)
    return cur->val;

  int m = (l + r) / 2;
  int h1 = query_seg(cur->left, bl, br, l, m);
  int h2 = query_seg(cur->right, bl, br, m + 1, r);

  if (h1 == 0)
    return h2;
  if (h2 == 0)
    return h1;

  return gcd(h1, h2);
}
Пример #3
0
int main() {
	int com, a, b, c;
	while (scanf("%d%d%d",&com,&a,&b) != EOF) {
		a += 2; b += 2;		//防止出现负数
		if (com == 0) {		//更新
			scanf("%d",&c);
			insert_seg(a, b, c);
		} else {			//查询
			printf("%d\n",query_seg(a,b));
		}
	}
	return 0;
}