Guest User

Untitled

a guest
Dec 26th, 2013
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.24 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <algorithm>
  3. using namespace std;
  4. int tree[900000];
  5. bool des[900000];
  6. bool lij[900000];
  7. int a,b,c,d,e,f,g,l;
  8. bool pi=false;
  9. bool h=false;
  10. int pi2=0;
  11. int query(int cvor,int from,int to,int a,int b)
  12. {
  13. //if(a==0 && b==g-1){pi2=tree[1];return tree[1];}
  14. if(from>=a && to<=b)
  15. {
  16. //printf("%d\n",pi);
  17. //printf("TT %d %d. %d,%d\n",tree[cvor],cvor,lij[cvor],des[cvor]);
  18. if(l==0){pi=des[cvor];pi2=tree[cvor];}
  19. else
  20. {
  21. if(pi2<0 && tree[cvor]<0 && tree[cvor]>=pi2)
  22. {
  23. pi2=tree[cvor];
  24. pi=des[cvor];
  25. }
  26. else if(pi2>tree[cvor] && tree[cvor]<0){h=true;}
  27. else if(pi2<tree[cvor] && pi2<0)
  28. {
  29. pi2=tree[cvor];
  30. pi=des[cvor];
  31. }
  32. else if(pi && lij[cvor] && !h)pi2+=tree[cvor];
  33. else if(pi2>tree[cvor] && !h)
  34. {
  35. h=true;
  36. }
  37. else if(pi2<=tree[cvor] && !h)
  38. {
  39. pi2=tree[cvor];
  40. pi=des[cvor];
  41. }
  42. else if(h && pi2<tree[cvor])
  43. {
  44. pi2=tree[cvor];
  45. }
  46. }
  47. //l=max(l,tree[cvor]);
  48. ++l;
  49. return tree[cvor];
  50. }
  51. int m1=-988988,m2=-9565656;
  52. if((from+to)/2>=a)m1=query(cvor*2,from,(from+to)/2,a,b);
  53. if((from+to)/2+1<=b)m2=query(cvor*2+1,(from+to)/2+1,to,a,b);
  54. return max(m1,m2);
  55. }
  56. int main()
  57. {
  58. scanf("%d",&a);
  59. g=a;
  60. for(b=1;b<a;b*=2){}
  61. for(int i=0;i<b+a+1;++i)tree[i]=-950000;
  62. for(int i=0;i<a;++i)
  63. {scanf("%d",&tree[i+b]);des[i+b]=true;lij[i+b]=true;}
  64. for(int i=b+a-1;i>1;--i)
  65. {
  66. /*if(tree[i/2]==-50000)
  67. {*/
  68. if(i%2==1)
  69. {
  70. tree[i/2]=tree[i];
  71. lij[i/2]=lij[i];
  72. des[i/2]=des[i];
  73. }
  74. else if(i%2==0)
  75. {
  76. if(tree[i/2]==-950000){tree[i/2]=tree[i];lij[i/2]=lij[i];des[i/2]=des[i];}
  77. else if(tree[i/2]>=tree[i] && tree[i]<0){lij[i/2]=false;}
  78. else if(tree[i/2]<0 && tree[i]>=0){tree[i/2]=tree[i];des[i/2]=false;lij[i/2]=lij[i];}
  79. else if(tree[i/2]<0 && tree[i]<0 && tree[i]>=tree[i/2]){tree[i/2]=tree[i];des[i/2]=false;lij[i/2]=lij[i];}
  80. else if(lij[i+1]==true && des[i]==true)
  81. {
  82. if(tree[i/2]+tree[i]>tree[i/2])
  83. {
  84. tree[i/2]+=tree[i];
  85. lij[i/2]=lij[i];
  86. }
  87. }
  88. else if(tree[i/2]<tree[i])
  89. {
  90. tree[i/2]=tree[i];
  91. des[i/2]=false;
  92. lij[i/2]=lij[i];
  93. }
  94. }
  95. //printf("%d. %d --> %d %d %d\n",i,tree[i],tree[i/2],lij[i],des[i]);
  96. }
  97. //printf("%d\n",tree[1]);
  98. scanf("%d",&c);
  99. for(int i=0;i<c;++i)
  100. {
  101. scanf("%d%d",&e,&f);
  102. int ioi=query(1,0,b-1,e-1,f-1);
  103. printf("%d\n",pi2);
  104. pi=false;
  105. h=false;
  106. pi2=0;
  107. l=0;
  108. }
  109. return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment