Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <stdio.h>
- using namespace std;
- long long int n;
- long long int binarySearch(vector<long long int> &v, int num, int left, int right)
- {
- int middle = (left + right)/2;
- if(v[middle] == num)
- return v[middle];
- else if(right-left <= 1) {
- if(v[left] >= num)
- return v[left];
- else if(v[right] >= num)
- return v[right];
- else
- return v[right+1];
- }
- else if(v[middle] < num) {
- return binarySearch(v, num, middle, right);
- }
- else {
- return binarySearch(v, num, left, middle);
- }
- }
- void update(vector<long long int> &t, int l, int r) //Modifica los datos en un rango [l,r]
- {
- for (l += n, r += n+1; l < r; l >>= 1, r >>= 1)
- {
- if (l&1) t[l++]++;
- if (r&1) t[--r]++;
- }
- }
- long long int busqueda(vector<long long int> &v, long long int pos)
- {
- long long int cant = v[1];
- pos += n;
- while(pos!=1)
- {
- cant += v[pos];
- pos>>=1;
- }
- return cant;
- }
- int main()
- {
- vector<long long int> v2;
- for(long long int i = 1; i<=1000000000; i<<=1)
- v2.push_back(i);
- long long int interseccion = 0, searchl, searchr, m, t, l, r;
- scanf("%lld",&t);
- while(t--)
- {
- scanf("%lld %lld",&n,&m);
- vector<long long int> v(binarySearch(v2,n,0,v2.size())*2,0);
- while(m--)
- {
- scanf("%lld %lld",&l, &r);
- update(v,l+1,r-1);
- if(r-l>1)
- {
- searchl = busqueda(v,l);
- searchr = busqueda(v,r);
- interseccion += max(searchl,searchr)-min(searchl,searchr);
- }
- }
- printf("%lld\n",interseccion);
- interseccion = 0;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement