Guest User

Untitled

a guest
Dec 13th, 2024
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | Source Code | 0 0
  1. // #include <bits/stdc++.h>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <map>
  5. #include <set>
  6. #include <vector>
  7. #include <string>
  8. #include <climits>
  9. #include <queue>
  10. #include <sstream>
  11. #include <numeric>
  12. #include <stdlib.h>
  13. #include <stack>
  14. #include <cmath>
  15. #include <bitset>
  16. #include <unordered_map>
  17. #include <unordered_set>
  18. #include <iomanip>
  19. #include <cstring>
  20. #include <utility>
  21. #include <cassert>
  22. #include <fstream>
  23. #include <regex>
  24. using namespace std;
  25.  
  26. //#define int long long
  27.  
  28. // 1-Index Segment Tree
  29.  
  30. class SegmentTree1{
  31. private:
  32.     vector<vector<vector<int>>> m_tree;
  33.     int n;
  34.     void combine(int i, int j, int index){
  35. //        merge(m_tree[i].begin(), m_tree[i].end(), m_tree[j].begin(), m_tree[j].end(), back_inserter(m_tree[index]));
  36.         int si = int(m_tree[i].size());
  37.         int sj=int(m_tree[j].size());
  38.         int p=0;
  39.         int q=0;
  40.         while(p<si && q<sj){
  41.             if(m_tree[i][p][0]<m_tree[j][q][0]){
  42.                 m_tree[index].push_back({m_tree[i][p][0], p, q});
  43.                 ++p;
  44.             }else if(m_tree[i][p][0]>m_tree[j][q][0]){
  45.                 m_tree[index].push_back({m_tree[j][q][0], p, q});
  46.                 ++q;
  47.             }else {
  48.                 m_tree[index].push_back({m_tree[i][p][0], p, q});
  49.                 ++p;
  50.             }
  51.         }
  52.         while(p<si){
  53.             m_tree[index].push_back({m_tree[i][p][0], p, q});
  54.             ++p;
  55.         }
  56.         while(q<sj){
  57.             m_tree[index].push_back({m_tree[j][q][0], p, q});
  58.             ++q;
  59.         }
  60.     }
  61.     void build(int index, int left, int right, vector<int>&a){
  62.         if(left==right){
  63.             vector<int> begin = {a[left],0,0};
  64.             m_tree[index].push_back(begin);
  65.         }else{
  66.             int mid= (left+right)/2;
  67.             build(index+ 1, left, mid, a); // for 0 inddexm it will be 2*index + 1
  68.             build(index + (2*(mid-left+1)), mid+1, right, a);// for 0 inddexm it will be 2*index + 2
  69.             combine(index+ 1, index + (2*(mid-left+1)) , index);
  70.         }
  71.     }
  72.     int query_internal(int root, int tl, int tr, int left, int right, int mini){
  73.         int size = int(m_tree[root].size());
  74.         if(left > right) return 0;
  75.         if(mini >= size) return 0;
  76.         if(tl==left && tr ==right){
  77.             return (size-mini);
  78.         }
  79.         int mid = (tl+tr)/2;
  80.         int lefty = query_internal(root + 1, tl, mid, left, min(mid,right), m_tree[root][mini][1]);
  81.         int righty = query_internal(root + (2*(mid-tl+1)), mid+1, tr, max(mid+1,left), right, m_tree[root][mini][2]);
  82.         return lefty+righty;
  83.     }
  84.    
  85. public:
  86.     SegmentTree1(vector<int>& a){
  87.         n=int(a.size());
  88.         m_tree.resize(2*n);
  89.         build(1,0,n-1,a); // index, left, right, input vector // for 0 inddexm it will (0,0,n-1,a)
  90.     }
  91.     int query(int left, int right, int val){
  92.         int mid = (n-1)/2;
  93.         vector<int> temporary(n);
  94.         for(int i=0;i<n;i++) temporary[i]=m_tree[1][i][0];
  95.         int value =static_cast<int>(upper_bound(temporary.begin(), temporary.end(), val) - temporary.begin());
  96.         if(value==temporary.size()){
  97.             return 0;
  98.         }
  99.         int lefty = query_internal(1+1, 0, mid, left, min(mid,right), m_tree[1][value][1]);
  100.         int righty = query_internal(1 + (2*(mid-0+1)), mid+1, n-1, max(left, mid+1), right, m_tree[1][value][2]);
  101.         return lefty+righty;
  102.     }
  103.    
  104. };
  105.  
  106. void solve(int testCase){
  107.     int n;
  108.     cin>>n;
  109.     vector<int> a(n);
  110.     for(int i=0;i<n;i++) cin>>a[i];
  111.     int q;
  112.     cin>>q;
  113.     SegmentTree1 segTree(a);
  114.     for(int i=0;i<q;i++){
  115.         int l,r,x;
  116.         cin>>l>>r>>x;
  117.         if(n==1){
  118.             if(x<a[0]){
  119.                 cout<<"1\n";
  120.             }else cout<<"0\n";
  121.         }else{
  122.             int value = segTree.query(l - 1, r -1, x);
  123.             cout<<value<<endl;
  124.         }
  125.     }
  126. }
  127.  
  128. signed main(){
  129.     ios::sync_with_stdio(false);
  130.     cin.tie(nullptr);
  131.     int t=1;
  132.     int k=1;
  133.     while(k<=t){
  134.         solve(k);
  135.         k++;
  136.     }
  137.     return 0;
  138. }
  139.  
Advertisement
Add Comment
Please, Sign In to add comment