Advertisement
Guest User

Untitled

a guest
Apr 26th, 2015
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.58 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. struct Node {
  6. int sum;
  7. Node *lc, *rc;
  8. Node(int s);
  9. Node(Node*, Node*);
  10. };
  11.  
  12. Node::Node(int s) : sum(s), lc(nullptr), rc(nullptr) {}
  13. Node::Node(Node *l, Node *r) : sum(l->sum + r->sum), lc(l), rc(r) {}
  14.  
  15. Node* create(int l, int r) {
  16. if(l + 1 == r)
  17. return new Node(0);
  18. else
  19. return new Node(create(l, (l + r) / 2), create((l + r) / 2, r));
  20. }
  21.  
  22. int sum(Node *n, int r, int nl, int nr) {
  23. if(nr <= r)
  24. return n->sum;
  25. else if(r > nl)
  26. return sum(n->lc, r, nl, (nl + nr) / 2) +
  27. sum(n->rc, r, (nl + nr) / 2, nr);
  28. else
  29. return 0;
  30. }
  31.  
  32. Node* increase(Node *n, int x, int nl, int nr) {
  33. if(nl + 1 == nr)
  34. return new Node(n->sum + 1);
  35. else if(x < (nl + nr) / 2)
  36. return new Node(increase(n->lc, x, nl, (nl + nr) / 2), n->rc);
  37. else
  38. return new Node(n->lc, increase(n->rc, x, (nl + nr) / 2, nr));
  39. }
  40.  
  41. Node* nodes[100001];
  42.  
  43. bool ok(int n, int p, int k, int s) {
  44. return sum(nodes[min(p + s + 1, n)], s, 0, n) -
  45. sum(nodes[max(p - s , 0)], s, 0, n) >= k;
  46. }
  47.  
  48. int main(){
  49. int n, m;
  50. scanf("%d %d", &n, &m);
  51. nodes[0] = create(0, n);
  52. for(int i = 0; i < n; i++) {
  53. int b;
  54. scanf("%d", &b);
  55. b--;
  56. nodes[i + 1] = increase(nodes[i], b, 0, n);
  57. }
  58. for(int i = 0; i < m; i++) {
  59. int p, k;
  60. scanf("%d %d", &p, &k);
  61. int l = 0, r = n;
  62. while(l < r) {
  63. int s = (l + r) / 2;
  64. ok(n, p, k, s) ? (r = s) : (l = s + 1);
  65. }
  66. printf("%d\n", r);
  67. }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement