Advertisement
Guest User

chimic_eu_nu_gata

a guest
Oct 19th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define NMAX 100005
  3. using namespace std;
  4. ifstream fin("chimic.in");///nu-i ok
  5. ofstream fout("chimic.out");
  6. struct interval
  7. {
  8.     int s, d;
  9. };
  10. interval b[NMAX];
  11. int n, a[NMAX], S, sm;
  12. int max3(int a,int b,int c)
  13. {
  14.     return max(max(a,b),c);
  15. }
  16.  
  17. struct segNode
  18. {
  19.     int left, right, segsum, bestsum;
  20. };
  21. segNode tree[4*NMAX];
  22. void merge(segNode &node,segNode &cl,segNode &cr)
  23. {
  24.     node.segsum = cl.segsum+cr.segsum;
  25.     node.left = max(cl.segsum+cr.left,cl.left);
  26.     node.right = max(cr.segsum+cl.right,cr.right);
  27.     node.bestsum = max3(cl.bestsum,cr.bestsum,cl.right+cr.left);
  28. }
  29.  
  30. void build(int node,int tl,int tr)
  31. {
  32.     if(tl==tr)
  33.     {
  34.         tree[node].left=tree[node].right=tree[node].segsum=tree[node].bestsum=a[tl];
  35.         return;
  36.     }
  37.     int cl = node<<1;
  38.     int cr = cl|1;
  39.     int tm = (tl+tr)>>1;
  40.     build(cl,tl,tm);
  41.     build(cr,tm+1,tr);
  42.     merge(tree[node],tree[cl],tree[cr]);
  43. }
  44.  
  45. void query(segNode &res,int node,int tl,int tr,int l,int r)
  46. {
  47.     if(tl==l and tr==r)
  48.         res=tree[node];
  49.     else
  50.     {
  51.         int cl=node<<1;
  52.         int cr = cl|1;
  53.         int tm= (tl+tr)>>1;
  54.         if(r<=tm)
  55.             query(res,cl,tl,tm,l,r);
  56.         else if(l>tm)
  57.             query(res,cr,tm+1,tr,l,r);
  58.         else
  59.         {
  60.             segNode leftNode,rightNode;
  61.             query(leftNode,cl,tl,tm,l,tm);
  62.             query(rightNode,cr,tm+1,tr,tm+1,r);
  63.             merge(res,leftNode,rightNode);
  64.         }
  65.     }
  66. }
  67. int main()
  68. {
  69.     int i;
  70.     fin>>n;
  71.     for(i=1;i<=n;i++)
  72.         fin>>a[i];
  73.     for(i=1;i<=n;i++)
  74.         fin>>b[i].s>>b[i].d;
  75.     build(1,1,n);                  /// se construieste segment tree
  76.     /**for(i=1;i<=n;i++)
  77.         cout<<tree[i].left<<" "<<tree[i].right<<" "<<tree[i].segsum<<endl;*/
  78.     for(i=1;i<=n;i++)  /// asta-i ca un fel de interogare pentru sume
  79.     {
  80.         if(b[i].s==-1)
  81.             break;
  82.         segNode res;
  83.         query(res,1,1,n,b[i].s,b[i].d);
  84.         cout<<res.bestsum<<endl;
  85.     }
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement