神奇的工作室-专业的游戏辅助工作室

CF #271 F Ant colony 树

来源: 本站

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <string>
 5 #include <string.h>
 6 #include <stdio.h>
 7 #include <math.h>
 8 #include <stdlib.h>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <set>
13 #include <ctime>
14 #include <numeric>
15 #include <cassert>
16 
17 using namespace std;
18 
19 const int N=1e5+10;
20 
21 int s[N];
22 pair<int,int> d[N];
23 int t[N<<2];
24 
25 int gcd(int a,int b){
26     if (b==0) return a;
27     return gcd(b,a%b);
28 }
29 void up(int rt) {
30     t[rt]=gcd(t[rt<<1],t[rt<<1|1]);
31 }
32 void build(int l,int r,int rt) {
33     if (l==r){
34         t[rt]=s[l];
35         return;
36     }
37     int m=(l+r)>>1;
38     build(l,m,rt<<1);
39     build(m+1,r,rt<<1|1);
40     up(rt);
41 }
42 int ask(int L,int R,int l,int r,int rt) {
43     if (L<=l&&r<=R) {
44         return t[rt];
45     }
46     int m=(l+r)>>1;
47     int ret=0,u=0,v=0;
48     if (L<=m)
49         u=ask(L,R,l,m,rt<<1);
50     if (R>m)
51         v=ask(L,R,m+1,r,rt<<1|1);
52     return gcd(u,v);
53 }
54 int main () {
55     int n;
56     scanf("%d",&n);
57     for (int i=1;i<=n;i++) {
58         scanf("%d",s+i);
59         d[i-1]=make_pair(s[i],i);
60     }
61     build(1,n,1);
62     sort(d,d+n);
63     int m;
64     scanf("%d",&m);
65     while (m--) {
66         int l,r;
67         scanf("%d %d",&l,&r);
68         int g=ask(l,r,1,n,1);
69         int u=lower_bound(d,d+n,make_pair(g,l))-d;
70         int v=lower_bound(d,d+n,make_pair(g,r+1))-d;
71         printf("%d
",r-l+1-(v-u));
72         //printf("%d %d %d
",g,u,v);
73     }
74     return 0;
75 }
上一篇:小号的作用