#include<cstdio>
#include<cstring>
int m;
int max(int x,int y)
{
return x>y?x:y;
}
int Log(int x)
{
int c=1;
while(x!=1)
{
x=x>>1;
c++;
}
return c;
}
void build(int n)
{
//m=前所有层数的数量
for(int i=1;i<=n;i++) m>>=1;
for(int i=1;i<=n;i++)
tree[i]=read();
}
void upgranted()
{
//倒序维护区间的最大值和最小值
//如果使用差分可以在单点修改的时候只修改一个节点
}
int query(int x)
{
printf("%d",tree[m+x]);
}
int main()
{
int n,s[1000][3],word[1000],N;
scanf("%d",&n);
memset(s,0,sizeof(s));
memset(word,0,sizeof(word));
for(int i=1;i<=n;i++) scanf("%d",&word[i]);
N=Log(n);
for(int i=1;i<=n;i++) s[i][0]=word[i];
for(int j=1;j<=N;j++)
{
for(int i=1;i<=n,(i+1<<j)-1<=n;i++)
{
s[i][j]=max(s[i][j-1],s[i+(1<<(j-1))][j-1]);
printf("(%d,%d)->(%d,%d)+(%d,%d)\n",i,i+1<<j-1,i,i+(1<<(j-1))-1,i+1<<(j-1),i+1<<j-1);
}
}
printf("%d ",s[1][2]);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
printf("%d %d\n",i,1<<i);
}
}
评论