4eyes4u

Mo's algorithm

May 5th, 2016
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N=1e4+10;
  5. const int rt=100;
  6. const int B=110;
  7.  
  8. struct Query
  9. {
  10.     int l, r, idx;
  11.     Query(): l(), r(), idx() {}
  12.     Query(int L, int R, int I): l(L), r(R), idx(I) {}
  13. } q[N];
  14.  
  15. int st[B], en[B], in[N], k;
  16. int n, m, a[N], sol[N];
  17. int l, r;
  18.  
  19. void init ()
  20. {
  21.     for (int i=1;i<=n;i+=rt)
  22.     {
  23.         st[++k]=i;
  24.         for (int j=0;j<rt;j++)
  25.         {
  26.             if (i+j<=n) in[i+j]=k;
  27.             else break;
  28.         }
  29.         en[k]=min(n, i+rt-1);
  30.     }
  31. }
  32.  
  33. inline bool cmp (Query a, Query b)
  34. {
  35.     if (in[a.l]==in[b.l]) return a.r<b.r;
  36.     return in[a.l]<in[b.l];
  37. }
  38.  
  39. inline void processQuery (int x)
  40. {
  41.     int ret=sol[q[x-1].idx];
  42.     if (q[x].l<l) for (int i=q[x].l;i<l;i++) ret+=a[i];
  43.     if (q[x].l>l) for (int i=l;i<q[x].l;i++) ret-=a[i];
  44.     if (q[x].r>r) for (int i=r+1;i<=q[x].r;i++) ret+=a[i];
  45.     if (q[x].r<r) for (int i=q[x].r+1;i<=r;i++) ret-=a[i];
  46.     l=q[x].l;
  47.     r=q[x].r;
  48.     sol[q[x].idx]=ret;
  49. }
  50.  
  51. int main()
  52. {
  53.     scanf ("%d%d", &n, &m);
  54.     for (int i=1;i<=n;i++) scanf ("%d", &a[i]);
  55.     init();
  56.     for (int i=1;i<=m;i++)
  57.     {
  58.         int L, R;
  59.         scanf ("%d%d", &L, &R);
  60.         q[i]=*new Query(L, R, i);
  61.     }
  62.  
  63.     sort (q+1, q+m+1, cmp);
  64.     for (int i=q[1].l;i<=q[1].r;i++) sol[q[1].idx]+=a[i];
  65.     l=q[1].l;
  66.     r=q[1].r;
  67.     for (int i=2;i<=m;i++) processQuery(i);
  68.     for (int i=1;i<=m;i++) printf ("%d\n", sol[i]);
  69.  
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment