ST算法板子

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int x,fp,f[200100][22],h[100100];
 4 char ch;
 5 inline int read()
 6 {
 7     x=0;fp=1;ch=getchar();
 8     while(ch<'0'||ch>'9'){if(ch=='-')fp=-1;ch=getchar();}
 9     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 
10     return x*fp;
11 }
12 int n,m,a[1000100],s[1000100],ans=0,sum;
13 void STpre()
14 {
15     for(int i=1;i<=n;i++)f[i][0]=a[i];
16     int t=log(n)/log(2)+1;
17     for(int j=1;j<=t;j++)
18         for(int i=1;i<=n;i++)
19             f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
20     int ss=1,sum=0;
21     for(int i=1;i<=n;i++)
22     {if(i==ss*2){sum++;ss*=2;}h[i]=sum;}
23 }
24 void work()
25 {
26     int cj,xx,yy; 
27     while(m--)
28     {
29         xx=read();yy=read();
30         cj=yy-xx+1;
31         printf("%d\n",max(f[xx][h[cj]],f[yy-(1<<h[cj])+1][h[cj]]));
32     }
33 }
34 int main()
35 {
36     //freopen("xf.in","r",stdin);
37     //freopen("xf.out","w",stdout);
38     n=read();m=read();
39     for(int i=1;i<=n;i++)a[i]=read();
40     STpre();
41     work();
42     return 0;
43 }
44  
View Code

 

posted @ 2020-08-27 15:45  mybing  阅读(124)  评论(0编辑  收藏  举报