ACM模板库

ACM模板库


静态第K大

<pre><code class="language-cpp">#include&lt;stdio.h&gt; #include&lt;iostream&gt; #include&lt;algorithm&gt; #include&lt;cstring&gt; using namespace std; const int maxn = 1e5 + 10; int n, m; int cnt; struct node{ int L, R;//分别指向左右子树 int sum;//该节点所管辖区间范围内数的个数 node(){ sum = 0; } }Tree[maxn * 20]; struct value{ int x;//值的大小 int id;//离散之前在原数组中的位置 }Value[maxn]; bool cmp(value v1, value v2) { return v1.x &lt; v2.x; } int root[maxn];//多颗线段树的根节点 int rank[maxn];//原数组离散之后的数组 void init() { cnt = 1; root[0] = 0; Tree[0].L = Tree[0].R = Tree[0].sum = 0; } void update(int num, int &amp;rt, int l, int r) { Tree[cnt++] = Tree[rt]; rt = cnt - 1; Tree[rt].sum++; if(l == r) return; int mid = (l + r)&gt;&gt;1; if(num &lt;= mid) update(num, Tree[rt].L, l, mid); else update(num, Tree[rt].R, mid + 1, r); } int query(int i, int j, int k, int l, int r) { int d = Tree[Tree[j].L].sum - Tree[Tree[i].L].sum; if(l == r) return l; int mid = (l + r)&gt;&gt;1; if(k &lt;= d) return query(Tree[i].L, Tree[j].L, k, l, mid); else return query(Tree[i].R, Tree[j].R, k - d, mid + 1, r); } int main() { scanf("%d%d", &amp;n, &amp;m); for(int i = 1; i &lt;= n; i++) { scanf("%d", &amp;Value[i].x); Value[i].id = i; } //进行离散化 sort(Value + 1, Value + n + 1, cmp); for(int i = 1; i &lt;= n; i++) { rank[Value[i].id] = i; } init(); for(int i = 1; i &lt;= n; i++) { root[i] = root[i - 1]; update(rank[i], root[i], 1, n); } int left, right, k; for(int i = 1; i &lt;= m; i++) { scanf("%d%d%d", &amp;left, &amp;right, &amp;k); printf("%d\n", Value[query(root[left - 1], root[right], k, 1, n)].x); } return 0; } </code></pre>

页面列表

ITEM_HTML