Advertisement
kolek0002

Untitled

Jan 16th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.58 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int const zak=128*1024;
  4. int d, n, dl, x, y, czas;
  5. pair<int, int> drzewo[2*zak];
  6.  
  7. int sufi(int a){
  8. int b;
  9. while(a>1){
  10. a/=2;
  11. b++;
  12. }
  13. b=pow(2, b);
  14. if(b!=a)
  15. b*=2;
  16. return b;
  17. }
  18.  
  19. //sprowadz do ile na przedziale od (dl)+a do (dl)+b (sprawdz, czy zgadza sie p, q, a, b (wielkosci wzgledem dl))
  20. void in(int gdzie, int p, int q, int a, int b, int ile){
  21. if(a<=p && b>=q){
  22. drzewo[gdzie]=make_pair(ile, czas);
  23. czas++;
  24. return;
  25. }
  26. int sr=(p+q)/2;
  27. if(a<=sr)
  28. in(gdzie*2, p, sr, a, b, ile);
  29. if(b>sr)
  30. in(gdzie*2+1, sr+1, q, a, b, ile);
  31. drzewo[gdzie]=max(drzewo[2*gdzie], drzewo[2*gdzie+1]);
  32. return;
  33. }
  34.  
  35. int akt(int v){
  36. pair<int, int> naj=drzewo[v];
  37. while(v>1){
  38. v/=2;
  39. if(drzewo[v].second>naj.second)
  40. naj=drzewo[v];
  41. }
  42. return naj.first;
  43. }
  44.  
  45. //podaj max. wartosc od a do b (sprawdz, czy zgadza sie p, q, a, b (wielkosci wzgledem dl))
  46. int que(int gdzie, int p, int q, int a, int b){
  47. int ans=0;
  48. if(a<=p && b>=q)
  49. return max(ans, akt(gdzie));
  50. int sr=(p+q)/2;
  51. if(a<=sr)
  52. return max(ans, que(gdzie*2, p, sr, a, b));
  53. if(b>sr)
  54. return max(ans, que(gdzie*2+1, sr+1, q, a, b));
  55. printf("assert");
  56. return;
  57. }
  58.  
  59. int main(){
  60. scanf("%d%d", &d, &n);
  61. dl=sufi(n);
  62. for(int i=1; i<n+1; i++){
  63. scanf("%d%d", &x, &y);
  64. y=x+y;
  65. in(1, 1, dl, x, y, que(1, 1, dl, x, y)+1);
  66. }
  67. printf("%d", que(1, 1, dl, 1, dl));
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement