首页 > 代码库 > poj3264
poj3264
1 //Accepted 2384K 1766MS 2 #include <cstdio> 3 #include <cstring> 4 #define imax 50005 5 struct node 6 { 7 int l,r; 8 int tmax,tmin; 9 }f[3*imax]; 10 int num[imax]; 11 int n,m; 12 int max(int a,int b) 13 { 14 return a>b?a:b; 15 } 16 int min(int a,int b) 17 { 18 return a>b?b:a; 19 } 20 void build(int t,int l,int r) 21 { 22 f[t].l=l; 23 f[t].r=r; 24 if (f[t].l==f[t].r) 25 { 26 f[t].tmin=f[t].tmax=num[l]; 27 return ; 28 } 29 int mid=(f[t].l+f[t].r)/2; 30 build(2*t,l,mid); 31 build(2*t+1,mid+1,r); 32 f[t].tmax=max(f[2*t].tmax,f[2*t+1].tmax); 33 f[t].tmin=min(f[2*t].tmin,f[2*t+1].tmin); 34 } 35 void query(int t,int l,int r,int &tmax,int &tmin) 36 { 37 if (f[t].l==l && f[t].r==r) 38 { 39 tmax=f[t].tmax; 40 tmin=f[t].tmin; 41 return ; 42 } 43 int mid=(f[t].l+f[t].r)/2; 44 if (r<=mid) query(2*t,l,r,tmax,tmin); 45 else 46 { 47 if (l>mid) query(2*t+1,l,r,tmax,tmin); 48 else 49 { 50 int max1,max2,min1,min2; 51 query(2*t,l,mid,max1,min1); 52 query(2*t+1,mid+1,r,max2,min2); 53 tmax=max(max1,max2); 54 tmin=min(min1,min2); 55 } 56 } 57 } 58 int main() 59 { 60 while (scanf("%d%d",&n,&m)!=EOF) 61 { 62 for (int i=1;i<=n;i++) 63 scanf("%d",&num[i]); 64 build(1,1,n); 65 for (int i=1;i<=m;i++) 66 { 67 int x,y; 68 scanf("%d%d",&x,&y); 69 int tmax=0,tmin=0; 70 query(1,x,y,tmax,tmin); 71 printf("%d\n",tmax-tmin); 72 } 73 } 74 return 0; 75 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。