Submission #1154091

#TimeUsernameProblemLanguageResultExecution timeMemory
1154091WongYiKaiIndex (COCI21_index)C++20
0 / 110
1 ms576 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; inline int readInt() { int x = 0; char ch = getchar_unlocked(); while (ch < '0' || ch > '9') ch = getchar_unlocked(); while (ch >= '0' && ch <= '9'){ x = (x << 3) + (x << 1) + ch - '0'; ch = getchar_unlocked(); } return x; } // Constructs a segment tree and stores sTree[] void buildTree(int idx, int ss, int se, vector<ll> a[], vector<ll> sTree[]) { /*leaf node*/ if (ss == se) { sTree[idx] = a[ss]; return; } int mid = (ss + se) / 2; /* building left subtree */ buildTree(2 * idx + 1, ss, mid, a, sTree); /* building right subtree */ buildTree(2 * idx + 2, mid + 1, se, a, sTree); /* merging left and right child in sorted order */ merge(sTree[2 * idx + 1].begin(), sTree[2 * idx + 1].end(), sTree[2 * idx + 2].begin(), sTree[2 * idx + 2].end(), back_inserter(sTree[idx])); } // Recursive function to count smaller elements from row // a[ss] to a[se] and value smaller than or equal to k. int queryRec(int node, int start, int end, int ss, int se, int k, vector<ll> a[], vector<ll> sTree[]) { /* If out of range return 0 */ if (ss > end || start > se) return 0; /* if inside the range return count */ if (ss <= start && se >= end) { /* binary search over the sorted vector to return count >= X */ return upper_bound(sTree[node].begin(), sTree[node].end(), k) - sTree[node].begin(); } int mid = (start + end) / 2; /*searching in left subtree*/ int p1 = queryRec(2 * node + 1, start, mid, ss, se, k, a, sTree); /*searching in right subtree*/ int p2 = queryRec(2 * node + 2, mid + 1, end, ss, se, k, a, sTree); /*adding both the result*/ return p1 + p2; } // A wrapper over query(). int query(int start, int end, int k, vector<ll> a[], int n, vector<ll> sTree[]) { return queryRec(0, 0, n - 1, start, end, k, a, sTree); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n,q; n = readInt(); q = readInt(); vector<ll> p[n+5]; for (int i=0;i<n;i++){ ll temp; temp = readInt(); p[i].push_back(temp); } vector<ll> sTree[n+5]; buildTree(0,0,n-1,p,sTree); while (q--){ ll l,r; l = readInt(); r = readInt(); ll range = r-l+1; ll l2=0,r2=range+5; while (l2<r2){ ll m = l2+(r2-l2)/2; if(range - query(l-1,r-1,m-1,p,n,sTree) >= m) l2=m+1; else r2=m; } cout << l2-1 << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...