Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<algorithm>
- #include<vector>
- #include<cstring>
- #include<queue>
- #include<cstdio>
- using namespace std;
- #define MEM(a,b) memset(a,(b),sizeof(a))
- #define MP make_pair
- #define pb push_back
- #define inf 1000000000
- #define maxr 300000
- typedef pair<int,int> pi;
- typedef vector<int> vi;
- //typedef __int64 LL;
- typedef long LL;
- int arr[100005];
- vi all[maxr];
- void build(int node,int L,int R)
- {
- int i;
- if(L==R)
- {
- all[node].pb(arr[L]);
- return;
- }
- int x=0,y=0,mid=(L+R)/2,p=node*2,q=node*2+1;
- build(node*2,L,mid);
- build(node*2+1,mid+1,R);
- while(x<all[p].size() || y<all[q].size())
- {
- int a= x<all[p].size() ? all[p][x] : inf;
- int b= y<all[q].size() ? all[q][y] : inf;
- if(a<b)
- all[node].pb(a),x++;
- else
- all[node].pb(b),y++;
- }
- }
- int kquery(int node,int L,int R,int LL,int RR,int K)
- {
- if(LL>R || RR<L) return 0;
- if(LL<=L && RR>=R)
- {
- int lo=0,hi=all[node].size()-1,ret=0;
- while(lo<=hi)
- {
- int mid=(lo+hi)/2;
- if(all[node][mid]<=K)
- ret=mid+1,lo=mid+1;
- else
- hi=mid-1;
- }
- return ret;
- }
- int mid=(L+R)/2;
- int p1=kquery(node*2,L,mid,LL,RR,K);
- int p2=kquery(node*2+1,mid+1,R,LL,RR,K);
- return p1+p2;
- }
- int main()
- {
- int i,j,k,tests,cs=0,a,b,n,m;
- scanf("%d%d",&n,&m);
- for(i=1;i<=n;i++)
- scanf("%d",&arr[i]);
- build(1,1,n);
- for(i=0;i<m;i++)
- {
- scanf("%d%d%d",&a,&b,&k);
- int lo=-1e9,hi=+1e9,ans;
- while(lo<=hi)
- {
- int mid=(lo+hi)/2;
- int cnt=kquery(1,1,n,a,b,mid);
- if(cnt<k)
- lo=mid+1;
- else
- ans=mid,hi=mid-1;
- }
- printf("%d\n",ans);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement