Advertisement
nicuvlad76

Untitled

Jan 21st, 2023
651
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <fstream>
  2. #include <algorithm>
  3. #include <cmath>
  4. #define N 100005
  5. using namespace std;
  6. ifstream fin("median_query.in");
  7. ofstream fout("median_query.out");
  8. struct Elem
  9. {
  10.     int val, poz;
  11.     bool operator <(const Elem &other) const
  12.     { return val<other.val;}
  13. };
  14.  
  15. Elem nnorm[N];
  16. int rnorm[N];
  17. int vect[N], Lbuck;
  18. struct Query
  19. {
  20.     int l,r, orig;
  21.     bool operator<(const  Query & other) const
  22.     {
  23.         if(l/Lbuck == other.l/Lbuck) return r < other.r;
  24.         return l/Lbuck < other.l/Lbuck;
  25.     }
  26. }queries[N];
  27.  
  28. int  sol[N];
  29. int n,q;
  30. struct AIB
  31. {
  32.     int v[N];
  33.     void update(int node, int val)
  34.     {
  35.         for(int i=node;i<=n;i+=(i&(-i)))
  36.             v[i]+=val;
  37.     }
  38.     int query(int node)
  39.     {
  40.         int s=0;
  41.         for(int i=node;i>=1;i-=(i&(-i)))
  42.             s+=v[i];
  43.         return s;
  44.     }
  45.     int binar(int val)
  46.     {
  47.         int step=(1<<17);
  48.         int poz=0;
  49.         while(step)
  50.         {
  51.             if(poz+step<=n && v[poz+step]<val)
  52.                 val-=v[poz+step],poz+=step;
  53.             step/=2;
  54.         }
  55.         return poz+1;
  56.     }
  57. }aib;
  58. void ADD(int poz)
  59. {
  60.     aib.update(vect[poz],1);
  61. }
  62. void DEL(int poz)
  63. {
  64.     aib.update(vect[poz],-1);
  65. }
  66. int main()
  67. {
  68.     fin>>n>>q;
  69.     Lbuck=sqrt(n);
  70.     for(int i=1;i<=n;i++)
  71.     {
  72.         int x;
  73.         fin>>x;
  74.         nnorm[i].val=x;
  75.         nnorm[i].poz=i;
  76.     }
  77.     sort(nnorm+1,nnorm+n+1);
  78.     for(int i=1;i<=n;i++)
  79.     {
  80.         vect[nnorm[i].poz]=i;
  81.         rnorm[i]=nnorm[i].val;
  82.     }
  83.     for(int i=1;i<=q;++i)
  84.     {
  85.         fin>>queries[i].l>>queries[i].r;
  86.         queries[i].orig=i;
  87.     }
  88.     sort(queries+1, queries+q+1);
  89.     int st=1, dr=0;
  90.     for(int i=1;i<=q;++i)
  91.     {
  92.         int l,r;
  93.         l=queries[i].l;
  94.         r=queries[i].r;
  95.         while(dr<r) ++dr, ADD(dr);
  96.         while(st<l) DEL(st), ++st;
  97.  
  98.         while(st>l) --st, ADD(st);
  99.         while(dr>r) DEL(dr),--dr;
  100.         int med=(r-l+2)/2;
  101.         sol[queries[i].orig]=rnorm[aib.binar(med)];
  102.     }
  103.     for(int i=1;i<=q;i++)
  104.         fout<<sol[i]<<"\n";
  105.     return 0;
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement