HDU4251

http://acm.hdu.edu.cn/showproblem.php?pid=4251

 1 using namespace std;
 2 #define MAX 100007
 3 struct node
 4 {
 5     int num[MAX];
 6     int val[MAX];
 7 }t[40];
 8 int srted[MAX];
 9 int n, m;
10 void build(int l, int r, int d)
11 {
12     if (l == r) return;
13     int mid = (l + r) >> 1; 
14     int midd = srted[mid];
15     int same = mid - l + 1, samed = 0, zn = l - 1, yn = mid, i;                                                
16     for (i = l; i <= r; ++i)
17     {
18         if (t[d].val[i]<midd)
19             --same;
20     }
21     for (i = l; i <= r; ++i)
22     {
23         if (i == l) t[d].num[i] = 0;
24         else t[d].num[i] = t[d].num[i - 1];
25         if (t[d].val[i]<midd)
26         {
27             ++t[d].num[i];
28             t[d + 1].val[++zn] = t[d].val[i];
29         }
30         else if (t[d].val[i]>midd)
31         {
32             t[d + 1].val[++yn] = t[d].val[i];
33         }
34         else
35         {
36             if (samed<same)
37             {
38                 ++samed;
39                 ++t[d].num[i];
40                 t[d + 1].val[++zn] = t[d].val[i];
41             }
42             else 
43                 t[d + 1].val[++yn] = t[d].val[i];
44         }
45     }
46     build(l, mid, d + 1);
47     build(mid + 1, r, d + 1);
48 }
49 int query(int a, int b, int k, int l, int r, int d) 
50 {
51     int p, q, m,mid;
52     if (a == b) 
53         return t[d].val[a];
54     mid = (l + r) >> 1;
55     int sx = t[d].num[a - 1], sy = t[d].num[b];
56     if (a - 1<l) sx = 0;
57     if (sy - sx >= k) 
58         return query(l + sx, l + sy - 1, k, l, mid, d + 1);
59     else
60     {
61         if (a == 1)
62             p = 0;
63         else
64             p = a - q - sx;
65         q = b - a + 1 - sy + sx;
66         m = k - sy + sx; 
67         return query(mid + 1 + p, mid + p + q, m, mid + 1, r, d + 1);
68     }
69 }
70 int main()
71 {
72     int i, a, b, T, res;
73     while (cin >> n)
74     {
75         cout << "Case " << T << ":" << endl;
76         for (i = 1; i <= n; ++i)
77         {
78             cin >> srted[i];
79             t[0].val[i] = srted[i];
80         }
81         sort(srted + 1, srted + 1 + n);
82         build(1, n, 0);
83         cin >> m;
84         for (i = 1; i <= m; ++i)
85         {
86             cin >> a >> b;
87             res = query(a, b, (a + b) / 2 - a + 1, 1, n, 0);
88             cout << res << endl;
89         }
90     }
91     return 0;
92 }

 

posted @ 2018-05-19 21:26  晨昏暮晓  阅读(128)  评论(0)    收藏  举报