Advertisement
vladm98

Untitled

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