http://acm.timus.ru/problem.aspx?space=1&num=1126
简单的线段树求区间最值

1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 const int N=100002; 6 int a[N],ans ; 7 struct node 8 { 9 int l,r,Max; 10 } tree[N*4]; 11 void build(int t,int l,int r) 12 { 13 tree[t].l = l; 14 tree[t].r = r; 15 if (l==r) 16 { 17 tree[t].Max = a[r]; 18 return ; 19 } 20 int mid = (l+r)>>1; 21 build(t<<1,l,mid); 22 build(t<<1|1,mid+1,r); 23 tree[t].Max = max(tree[t<<1].Max,tree[t<<1|1].Max); 24 } 25 void Query(int t,int l,int r) 26 { 27 if (l <= tree[t].l && r>= tree[t].r) 28 { 29 ans = max(ans,tree[t].Max); 30 return ; 31 } 32 int mid = (tree[t].l+tree[t].r)>>1; 33 if (r <= mid) 34 Query(t<<1,l,r); 35 else if (l > mid) 36 Query(t<<1|1,l,r); 37 else 38 { 39 Query(t<<1,l,mid); 40 Query(t<<1|1,mid+1,r); 41 } 42 } 43 int main() 44 { 45 int m,n = 1,x; 46 scanf("%d",&m); 47 while(1) 48 { 49 scanf("%d",&x); 50 if (x == -1) 51 break; 52 a[n++] = x; 53 } 54 build(1,1,n); 55 for (int i = 1; i <= n-m; i++) 56 { 57 ans = 0; 58 Query(1,i,m+i-1); 59 printf("%d ",ans); 60 } 61 return 0; 62 }