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 }
poj3264
时间: 2025-01-07 23:41:42