Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <set>
  5. #include <map>
  6.  
  7. #define NMAX 100005
  8. using namespace std;
  9.  
  10. struct qu{
  11. int st, dr, where;
  12. }q[NMAX];
  13.  
  14. int Arb[4 * NMAX + 5], lazy[4 * NMAX + 5], stop[NMAX], T[NMAX], D[NMAX];
  15. set<int> s;
  16. map<int, int> mp;
  17.  
  18. void propag(int nod){
  19. if(lazy[nod] != 0){
  20. Arb[2 * nod] += lazy[nod];
  21. Arb[2 * nod + 1] += lazy[nod];
  22. lazy[2 * nod] += lazy[nod];
  23. lazy[2 * nod + 1] += lazy[nod];
  24. lazy[nod] = 0;
  25. }
  26. }
  27.  
  28. void Update(int st, int dr, int a, int b, int val, int nod){
  29. if(a <= st && dr <= b){
  30. Arb[nod] += lazy[nod];
  31. lazy[nod] += val;
  32. return;
  33. }
  34. propag(nod);
  35.  
  36. int mij = (st + dr) / 2;
  37. if(a <= mij) Update(st, mij, a, b, val, 2 * nod);
  38. if(b > mij) Update(mij + 1, dr, a, b, val, 2 * nod + 1);
  39.  
  40. Arb[nod] = min(Arb[2 * nod], Arb[2 * nod + 1]);
  41. }
  42.  
  43. int Query(int st, int dr, int a, int b, int nod){
  44. if(a <= st && dr <= b)
  45. return Arb[nod];
  46. propag(nod);
  47.  
  48. int rez1 = (1 << 30), rez2 = (1 << 30);
  49. int mij = (st + dr) / 2;
  50. if(a <= mij) rez1 = Query(st, mij, a, b, 2 * nod);
  51. if(b > mij) rez2 = Query(mij + 1, dr, a, b, 2 * nod + 1);
  52.  
  53. return min(rez1, rez2);
  54. }
  55.  
  56. int main()
  57. {
  58. ios_base::sync_with_stdio(false);
  59. cin.tie(0);
  60.  
  61. int n, m;
  62. cin >> n >> m;
  63.  
  64. int pw2 = log2(n) + 1;
  65. int N = (1 << pw2);
  66. for(int i = 1; i <= n; ++i){
  67. cin >> T[i] >> D[i];
  68.  
  69. s.insert(D[i]);
  70. }
  71.  
  72. int nr = 0;
  73. for(auto it: s)
  74. mp[it] = ++nr;
  75.  
  76. for(int i = 1; i <= n; ++i)
  77. Arb[N + i - 1] = mp[D[i]];
  78.  
  79. for(int i = N - 1; i >= 1; --i)
  80. Arb[i] = min(Arb[2 * i], Arb[2 * i + 1]);
  81.  
  82. for(int i = 1; i <= m; ++i)
  83. cin >> q[i].st >> q[i].dr;
  84.  
  85. int j = 1;
  86. for(int i = 1; i <= n; ++i){
  87. while(j <= n){
  88. Update(1, N, mp[D[j]], N, -T[j], 1);
  89. if(Query(1, N, 1, N, 1) <= 0)
  90. break;
  91. ++j;
  92. }
  93. stop[i] = j - 1;
  94. Update(1, N, mp[D[i]], N, T[i], 1);
  95. }
  96.  
  97. for(int i = 1; i <= m; ++i){
  98. if(stop[q[i].st] >= q[i].dr)
  99. cout << 1 << '\n';
  100. else cout << 0 << '\n';
  101. }
  102. return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement