SuitNdtie

LazyMap

Apr 13th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<map>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long int ll;
  7. map<ll,vector<int> > field;
  8.  
  9. int main()
  10. {
  11.     int n,m;
  12.     scanf("%d %d",&n,&m);
  13.     for(int i=1;i<=n;i++){
  14.         ll data;
  15.         scanf("%lld",&data);
  16.         field[data].push_back(i);
  17.     }
  18.     std::map<ll,vector<int> >::iterator it;it = field.begin();
  19.     while(it != field.end()){
  20.         sort(field[it->first].begin(),field[it->first].end());
  21.         advance(it,1);
  22.     }
  23.     for(int q = 0 ; q < m ; q ++){
  24.         int L,R;
  25.         ll value;
  26.         scanf("%d %d %lld",&L,&R,&value);
  27.         it = field.find(value);
  28.         if(it == field.end()){
  29.             printf("0\n");
  30.             continue;
  31.         }
  32.        
  33.         vector<int> vec = it -> second;
  34.         int Lidx = 0,Ridx = vec.size() - 1;
  35.         int l =  0 , r = vec.size() - 1;
  36.         while(l <= r){
  37.             int m = (l+r)/2;
  38.             if(vec[m] <= R){
  39.                 l = m + 1;
  40.             }
  41.             else if(vec[m] > R){
  42.                 r = m - 1;
  43.                 Ridx = min(Ridx,m);
  44.             }
  45.         }
  46.         l = 0 ; r = vec.size() - 1;
  47.         while(l <= r){
  48.             int m = (l+r)/2;
  49.             if(vec[m] >= L){
  50.                 r = m - 1;
  51.             }
  52.             else if(vec[m] < L){
  53.                 l = m + 1;
  54.                 Lidx = max(Lidx,m);
  55.             }
  56.         }
  57.     /*  printf("\n%d | ",value);
  58.         for(int i=0;i<vec.size();i++){
  59.             printf("%d ",vec[i]);
  60.         }
  61.         printf("\n %d %d\n",Lidx,Ridx);*/
  62.         if(Lidx == 0 && vec[0] >= L)Lidx--;
  63.         if(Ridx == vec.size() - 1 && vec[vec.size()-1] <= R)Ridx++;
  64.         printf("%d\n",Ridx - Lidx - 1);
  65.     }
  66.     return 0;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment