竹子听

#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);

}

}


评论