fork download
  1. #include <iostream>
  2. #include <string.h>
  3. #include <map>
  4. #include <queue>
  5. using namespace std;
  6.  
  7. const int S=200010;
  8. struct E{
  9. int l,r;
  10. bool operator<(const E& e1) const {
  11. if(l!=e1.l)return l>e1.l;
  12. return r>e1.r;
  13. }
  14. };
  15.  
  16. int main() {
  17. // your code goes here
  18. long long int memo1[S];
  19. long long int memo2[S];
  20. long long int dp[S];
  21. long long int data[S];
  22. long long int n,m;
  23. map<int,int> memo3;
  24. priority_queue<E> pq;
  25. memset(memo1,0,sizeof(memo1));
  26. memset(memo2,0,sizeof(memo2));
  27. memset(dp,0,sizeof(dp));
  28. cin>>n>>m;
  29. for(int i=0;i<n;i++){
  30. cin>>data[i];
  31. }
  32. dp[n]=0;
  33. E e1;
  34. for(int i=0;i<m;i++){
  35. int l,r;
  36. cin>>l>>r;
  37. memo1[r]++;
  38. e1.l=l-1;
  39. e1.r=r;
  40. pq.push(e1);
  41. }
  42.  
  43. for(int i=0;i<=n;i++){
  44. while(pq.size()>0 && pq.top().l<=i){
  45. E e1=pq.top();
  46. pq.pop();
  47. memo3[e1.r]++;
  48. }
  49. memo3[i]-=memo1[i];
  50. if(memo3[i]==0){
  51. memo3.erase(i);
  52. }
  53.  
  54. if(memo3.size()==0||(i+1==n)){
  55. memo2[i]=i+1;
  56. }else{
  57. map<int,int>::iterator it=memo3.end();
  58. it--;
  59. memo2[i]=(*it).first;
  60. }
  61.  
  62. }
  63. for(int i=0;i<n;i++){
  64. //cout<<i<<" "<<memo2[i]<<endl;
  65. long long int t=dp[i]+data[i];
  66. if(dp[memo2[i]]<t)dp[memo2[i]]=t;
  67. if(dp[i+1]<dp[i])dp[i+1]=dp[i];
  68. }
  69. long long int ans=0;
  70. for(int i=0;i<=n;i++){
  71. if(ans<dp[i])ans=dp[i];
  72. }
  73. cout<<ans<<endl;
  74. return 0;
  75. }
Success #stdin #stdout 0.01s 8372KB
stdin
20 10
870851814 594414687 615919461 65033245 460143082 617460823 881870957 126041265 623075703 34130727 27054628 853567651 483228744 491145755 220689940 148007930 229257101 790404982 612186806 281076231
15 19
20 20
12 13
1 4
19 19
9 13
3 6
9 12
16 16
18 19
stdout
4912419478