RMQ

 

Frequent values

 UVA - 11235 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define CLR(m,a) memset(m,a,sizeof(m))
 5 
 6 const int maxn=100010;
 7 int val[maxn],cnt[maxn];
 8 int num[maxn],Left[maxn],Right[maxn];
 9 int n,m;
10 int sz;
11 int d[maxn][25];
12 
13 void RMQ_init(int n){
14     for(int i=0;i<n;i++) d[i][0]=cnt[i];
15     for(int j=1;(1<<j)<=n;j++)
16     for(int i=0;i+(1<<j)-1<n;i++){
17         d[i][j]=max(d[i][j-1],d[i+(1<<j-1)][j-1]);
18     }
19 }
20 int RMQ(int L,int R){
21     int k=0;
22     while(1<<(k+1)<=R-L+1) k++;
23     return max(d[L][k],d[R-(1<<k)+1][k]);
24 }
25 int main()
26 {
27     while(scanf("%d",&n)==1&&n){
28         scanf("%d",&m);
29         sz=0;
30         int s,e;
31         CLR(cnt,0);
32         scanf("%d",&s);
33         Left[0]=0;
34         num[0]=0;
35         val[0]=s;
36         cnt[0]=1;
37         int f=0;
38         for(int i=1;i<n;i++){
39             scanf("%d",&e);
40             if(e==s){
41                 num[i]=sz;
42                 cnt[sz]++;
43                 Left[i]=f;
44             }else{
45                 for(int j=f;j<i;j++) Right[j]=i-1;
46                 sz++;
47                 val[sz]=e;
48                 cnt[sz]=1;
49                 num[i]=sz;
50                 Left[i]=i;
51                 Right[i]=i;
52                 f=i;   //记录最左的位置
53                 s=e;
54             }
55         }
56         RMQ_init(sz+1);
57         while(m--){
58             int a,b;
59             scanf("%d%d",&a,&b);
60             a--;b--;
61             int ans=0;
62             if(num[a]!=num[b]){
63                 ans=max(Right[a]-a+1,b-Left[b]+1);
64                 a=num[a]+1;
65                 b=num[b]-1;
66                 if(a<=b) ans=max(ans,RMQ(a,b));
67             }else 
68                 ans=b-a+1;
69             printf("%d\n",ans);
70         }
71     }
72     return 0;
73 }
View Code

 

posted @ 2017-07-31 13:34  yijiull  阅读(351)  评论(0编辑  收藏  举报