Code:
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1 << 17;
int n, dat[2*MAX_N - 1];
void init()
{
for(int i = 0; i < 2*n-1; i++)
dat[i] = INT_MAX;
}
void update(int k, int a) //将x位置的数字更新成a
{
k += n - 1;
dat[k] = a;
while(k > 0)
{
k = (k-1)/2;
dat[k] = min(dat[k*2+1], dat[k*2+2]);
}
}
int query(int a, int b, int k, int l, int r)
{
if(r <= a || b <= l)
return INT_MAX;
if(a <= l && b >= r)
return dat[k];
else
{
int vl = query(a, b, k*2+1, l, (l+r)/2);
int vr = query(a, b, k*2+2, (l+r)/2, r);
return min(vl, vr);
}
}
int main()
{
scanf("%d", &n);
n = pow(2, n);
init();
for(int i = 0; i < n; i++)
{
int x;
scanf("%d", &x);
update(i, x);
}
for(int i = 0; i < n; i++)
cout << dat[i] << " ";
cout << endl;
while(1)
{
int l, r;
cin >> l >> r;
cout << query(l, r, 0, 0, n) << endl;
}
return 0;
}
11万+

被折叠的 条评论
为什么被折叠?



