Advertisement
Guest User

Untitled

a guest
Apr 29th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <stdio.h>
  5.  
  6. using namespace std;
  7.  
  8. long long int n;
  9.  
  10. long long int binarySearch(vector<long long int> &v, int num, int left, int right)
  11. {
  12.     int middle = (left + right)/2;
  13.     if(v[middle] == num)
  14.         return v[middle];
  15.     else if(right-left <= 1) {
  16.         if(v[left] >= num)
  17.             return v[left];
  18.         else if(v[right] >= num)
  19.             return v[right];
  20.         else
  21.             return v[right+1];
  22.     }
  23.     else if(v[middle] < num) {
  24.         return binarySearch(v, num, middle, right);
  25.     }
  26.     else {
  27.         return binarySearch(v, num, left, middle);
  28.     }
  29. }
  30.  
  31. void update(vector<long long int> &t, int l, int r) //Modifica los datos en un rango [l,r]
  32. {
  33.     for (l += n, r += n+1; l < r; l >>= 1, r >>= 1)
  34.     {
  35.         if (l&1) t[l++]++;
  36.         if (r&1) t[--r]++;
  37.     }
  38. }
  39.  
  40. long long int busqueda(vector<long long int> &v, long long int pos)
  41. {
  42.     long long int cant = v[1];
  43.     pos += n;
  44.     while(pos!=1)
  45.     {
  46.         cant += v[pos];
  47.         pos>>=1;
  48.     }
  49.     return cant;
  50. }
  51.  
  52. int main()
  53. {
  54.     vector<long long int> v2;
  55.     for(long long int i = 1; i<=1000000000; i<<=1)
  56.         v2.push_back(i);
  57.     long long int interseccion = 0, searchl, searchr, m, t, l, r;
  58.     scanf("%lld",&t);
  59.     while(t--)
  60.     {
  61.         scanf("%lld %lld",&n,&m);
  62.         vector<long long int> v(binarySearch(v2,n,0,v2.size())*2,0);
  63.         while(m--)
  64.         {
  65.             scanf("%lld %lld",&l, &r);
  66.             update(v,l+1,r-1);
  67.             if(r-l>1)
  68.             {
  69.                 searchl = busqueda(v,l);
  70.                 searchr = busqueda(v,r);
  71.                 interseccion += max(searchl,searchr)-min(searchl,searchr);
  72.             }
  73.         }
  74.         printf("%lld\n",interseccion);
  75.         interseccion = 0;
  76.     }
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement