Advertisement
a53

Chimic

a53
Oct 23rd, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.28 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. using namespace std;
  4. vector <long long> Aint;
  5. vector <pair <int,int>> Interval;
  6.  
  7. void Update(int nod,int st,int dr,long long val,int poz)
  8. {
  9. if(st==dr)
  10. {
  11. Aint[nod]+=val;
  12. return;
  13. }
  14. int mij=st+dr>>1;
  15. if(poz<=mij)
  16. Update(nod<<1,st,mij,val,poz);
  17. else
  18. Update(nod<<1|1,mij+1,dr,val,poz);
  19. Aint[nod]=max(Aint[nod<<1],Aint[nod<<1|1]);
  20. }
  21.  
  22. long long RangeQuerry(int nod,int st,int dr,int a,int b)
  23. {
  24. if(a<=st&&dr<=b)
  25. return Aint[nod];
  26. int mij=st+dr>>1;
  27. long long MaxLeft=0;
  28. long long MaxRight=0;
  29. if(a<=mij)
  30. MaxLeft=RangeQuerry(nod<<1,st,mij,a,b);
  31. if(mij<b)
  32. MaxRight=RangeQuerry(nod<<1|1,mij+1,dr,a,b);
  33. return max(MaxLeft,MaxRight);
  34. }
  35.  
  36. int main(int argc,char const *argv[])
  37. {
  38. int n;
  39. ifstream f("chimic.in");
  40. f>>n;
  41. Aint.resize(n<<2);
  42. Interval.resize(n+1);
  43. fill(Aint.begin(),Aint.end(),0);
  44. for(int i=1;i<=n;++i)
  45. {
  46. int x;
  47. f>>x;
  48. Update(1,1,n,1LL*x,i);
  49. }
  50. for(int i=1;i<=n;++i)
  51. f>>Interval[i].first>>Interval[i].second;
  52. f.close();
  53. for(int i=n;i>=1;--i)
  54. {
  55. if(Interval[i].first==-1)
  56. continue;
  57. long long maxim=RangeQuerry(1,1,n,Interval[i].first,Interval[i].second);
  58. Update(1,1,n,maxim,i);
  59. }
  60. ofstream g("chimic.out");
  61. g<<Aint[1];
  62. g.close();
  63. return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement