VandanRogheliya

Untitled

Jul 15th, 2020
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.96 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define FOR(i, j, k, in) for (int i=j ; i<k ; i+=in)
  5. #define RFOR(i, j, k, in) for (int i=j ; i>=k ; i-=in)
  6. #define FO(i, j) FOR(i, 0, j, 1)
  7. #define RFO(i, j) RFOR(i, j, 0, 1)
  8. #define all(cont) cont.begin(), cont.end()
  9. #define rall(cont) cont.end(), cont.begin()
  10. #define FOREACH(it, l) for (auto it = l.begin(); it != l.end(); it++)
  11. #define mp make_pair
  12. #define pb push_back
  13. #define setbits(x) __builtin_popcountll(x)
  14. #define zrobits(x) __builtin_ctzll(x)
  15. #define ps(x,y) fixed<<setprecision(y)<<x //cout << ps(ans, decimal places);
  16. #define INF (int)1e9
  17. #define EPS 1e-9
  18. #define PI 3.1415926535897932384626433832795
  19. typedef pair<int, int> pi;
  20. typedef pair<long long, long long> pll;
  21. typedef vector<int> vi;
  22. typedef vector<long long> vl;
  23. typedef vector<string> vs;
  24. typedef vector<pi> vpii;
  25. typedef vector<vi> vvi;
  26. typedef vector<vl> vvl;
  27. typedef map<int,int> mi;
  28. typedef map<long long,long long> ml;
  29. typedef set<int> si;
  30. typedef set<long long> sl;
  31. typedef long long int ll;
  32. typedef unsigned long long int  ull;
  33. typedef priority_queue<ll> mxhpl;
  34. typedef priority_queue<int> mxhpi;
  35. typedef priority_queue<ll, vector<ll>, greater<ll>> mnhpl;
  36. typedef priority_queue<int, vector<int>, greater<int>> mnhpi;
  37.  
  38. void IO() {
  39.   ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  40. #ifndef ONLINE_JUDGE
  41.   freopen("input.txt", "r", stdin);
  42.   // freopen("output.txt", "w", stdout);
  43. #endif
  44. }
  45.  
  46. template<typename... T>
  47. void read(T&... args) {
  48.   ((cin >> args), ...);
  49. }
  50.  
  51. template<typename... T>
  52. void write(T&&... args) {
  53.   ((cout << args << " "), ...);
  54. }
  55.  
  56. #define MOD 1000000007
  57. int mpow(int, int);
  58. /*******************************************************/
  59.  
  60. const int I = 0, Q = 1;
  61.  
  62. class Info {
  63. public:
  64.   int type, l, r, i, val, end;
  65.   Info() {
  66.     type = l = r = i = val = end = -1;
  67.   }
  68. };
  69.  
  70. int n, m,sgt[70000] = {0};
  71. //  a[30001],
  72. vector<Info> qs;
  73. unordered_map<int,int> occ;
  74.  
  75. int comp_ends(const Info& a, const Info& b) {
  76.   if (a.type == b.type) {
  77.     if (a.type == Q) return a.r <= b.r;
  78.     return a.i <= b.i;
  79.   } else {
  80.     if (a.type == Q) return a.r < b.i;
  81.     return a.i <= b.r;
  82.   }
  83. }
  84.  
  85. void insert(int i, int val, int l, int r, int pos) {
  86.   if (l == r && l == i) {
  87.     sgt[pos] = val;
  88.     return;
  89.   }
  90.   else if (l == r || l > i || i > r) return;
  91.   int mid = (l+r)/2;
  92.   if (mid < i) insert(i,val,mid+1,r,pos*2+2);
  93.   else insert(i,val,l,mid,pos*2+1);
  94.  
  95.   sgt[pos] = sgt[pos*2+2]+sgt[pos*2+1];
  96. }
  97.  
  98. int query(int low, int high, int l, int r, int pos) {
  99.   if (low <= l && high >= r) return sgt[pos];
  100.   else if (low > r || high < l) return 0;
  101.  
  102.   int mid = (r+l)/2;
  103.   int ans = query(low,high,l,mid,pos*2+1);
  104.   ans += query(low,high,mid+1,r,pos*2+2);
  105.  
  106.   return ans;
  107. }
  108.  
  109. void solve() {
  110.   read(n);
  111.   FO(i,n) {
  112.     Info tmp;
  113.     tmp.type = I;
  114.     read(tmp.val);
  115.     tmp.i = i;
  116.     tmp.end = i;
  117.     qs.pb(tmp);
  118.   }
  119.  
  120.   read(m);
  121.   FO(i, m) {
  122.     Info tmp;
  123.     tmp.type = Q;
  124.     read(tmp.l, tmp.r);
  125.     tmp.l--;
  126.     tmp.r--;
  127.     tmp.i = i;
  128.     tmp.end = tmp.r;
  129.     qs.pb(tmp);
  130.   }
  131.  
  132.   sort((qs).begin(), (qs).end(), comp_ends);
  133.  
  134.   int ans[m];
  135.  
  136.   for(auto x: qs) {
  137.     // write(x.type, x.r, x.i, "\n");
  138.     if (x.type) {
  139.       ans[x.i] = query(x.l,x.r,0,n-1,0);
  140.  
  141.     } else {
  142.       if (occ.find(x.val) != occ.end()){
  143.         insert(x.i,1,0,n-1,0);
  144.         insert(occ[x.val],0,0,n-1,0);
  145.         occ[x.val] = x.i;
  146.  
  147.       } else {
  148.         insert(x.i,1,0,n-1,0);
  149.         occ[x.val] = x.i;
  150.  
  151.       }
  152.     }
  153.   }
  154.  
  155.   FO(i,m) cout << ans[i] << "\n";
  156.   // FO(i,m+n) write(qs[i].type?qs[i].r:qs[i].i);
  157. }
  158.  
  159. int main() {
  160.   IO();
  161.  
  162.   int t = 1;
  163.   // cin >> t;
  164.   while(t--) {
  165.     solve();
  166.   }
  167.  
  168.   return 0;
  169. }
  170.  
  171. /*******************************************************/
  172. int mpow(int base, int exp) {
  173.   base %= MOD;
  174.   int result = 1;
  175.   while (exp > 0) {
  176.     if (exp & 1) result = ((ll)result * base) % MOD;
  177.     base = ((ll)base * base) % MOD;
  178.     exp >>= 1;
  179.   }
  180.   return result;
  181. }
Add Comment
Please, Sign In to add comment