首页 > 代码库 > 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 }
View Code