Tranvick

MKTHNUM

Mar 6th, 2013
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:65777216")
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <cstdio>
  7. #include <algorithm>
  8. #include <cmath>
  9. #include <vector>
  10. #include <set>
  11. #include <stack>
  12. #include <map>
  13. #include <queue>
  14. #include <string>
  15. #include <memory.h>
  16. #include <iterator>
  17. #define y1 trololoy1
  18. #define y0 trololoy0
  19. #define mem(A,X) memset(A,X,sizeof(A))
  20. #define memo(A) memset(A,0,sizeof(A))
  21. #define forn(I,B) for (int I=1;I<=(B);I++)
  22. #define forg(H,V) for (int H=first[V];h;h=next[H])
  23. #define rep(I,B) for (int I=0;I<(B);I++)
  24. #define labs(X) (((X)>0)?(X):(-(X)))
  25. #define ropen(X) freopen(X,"r",stdin)
  26. #define wopen(X) freopen(X,"w",stdout)
  27. #define rwopen(X) freopen(X".in","r",stdin);freopen(X".out","w",stdout)
  28. #define pb push_back
  29. #define mp make_pair
  30. #define all(X) (X).begin(),(X).end()
  31. #define sqr(X) ((X)*(X))
  32.  
  33. using namespace std;
  34.  
  35. typedef pair <int,int> pii;
  36. typedef double ld;
  37. typedef long long ll;
  38. typedef pair <ll,ll> pll;
  39. typedef vector<int> vi;
  40. const int N=15000000;
  41. const int INF=111111111;
  42. const double eps=1e-9;
  43. const double pi=3.14159265358979;
  44.  
  45. struct tree{
  46.     int ls,rs,sum;
  47.     tree(){}
  48.     tree(int value):ls(0),rs(0),sum(value){}
  49. } t[N];
  50.  
  51. int c,n,a[100001],root[100001],k,sorted[100001],m;
  52.  
  53. int build(int l,int r){
  54.     int v=++c;
  55.     if (l==r) t[v]=tree(0);
  56.     else {
  57.         t[v].ls=build(l,(l+r)/2);
  58.         t[v].rs=build((l+r)/2+1,r);
  59.         t[v].sum=t[t[v].ls].sum+t[t[v].rs].sum;
  60.     }
  61.     return v;
  62. }
  63.  
  64. int getsum(int v,int l,int r,int tl,int tr){
  65.     if (tl>r || tr<l) return 0;
  66.     if (tl>=l && tr<=r) return t[v].sum;
  67.     return getsum(t[v].ls,l,r,tl,(tl+tr)/2)+getsum(t[v].rs,l,r,(tl+tr)/2+1,tr);
  68. }
  69.  
  70. int modify(int v,int pos,int value,int tl,int tr){
  71.     int nv=++c;
  72.     if (tl==tr) t[nv]=tree(value);
  73.     else {
  74.         int mid=(tl+tr)/2;
  75.         if (pos<=mid) t[nv].rs=t[v].rs,t[nv].ls=modify(t[v].ls,pos,value,tl,mid);
  76.         else t[nv].ls=t[v].ls,t[nv].rs=modify(t[v].rs,pos,value,mid+1,tr);
  77.         t[nv].sum=t[t[nv].ls].sum+t[t[nv].rs].sum;
  78.     }
  79.     return nv;
  80. }
  81.  
  82. int get_k(int p,int q,int k,int tl,int tr){
  83.     if (tl==tr) return tl;
  84.     if (t[t[q].ls].sum-t[t[p].ls].sum>=k) return get_k(t[p].ls,t[q].ls,k,tl,(tl+tr)/2);
  85.     else return get_k(t[p].rs,t[q].rs,k-t[t[q].ls].sum+t[t[p].ls].sum,(tl+tr)/2+1,tr);
  86. }
  87.  
  88. int main(){
  89. //  ropen("input.txt");
  90.     scanf("%d%d",&n,&m);
  91.     forn(i,n) scanf("%d",&a[i]);
  92.     forn(i,n) sorted[i]=a[i];
  93.     sort(sorted+1,sorted+n+1);
  94.     forn(i,n) a[i]=lower_bound(sorted+1,sorted+n+1,a[i])-sorted;
  95.     root[k++]=build(1,n);
  96.     forn(i,n){
  97.         int val=getsum(root[k-1],a[i],a[i],1,n);
  98.         root[k]=modify(root[k-1],a[i],val+1,1,n);
  99.         ++k;
  100.     }
  101.     rep(i,m){              
  102.         int l,r,k;
  103.         scanf("%d%d%d",&l,&r,&k);
  104.         printf("%d\n",sorted[get_k(root[l-1],root[r],k,1,n)]);
  105.     }                                                            
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment