Guest User

GSS1 solution

a guest
Mar 16th, 2018
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3.  
  4. #define ll          long long
  5. #define pb          push_back
  6. #define mp          make_pair
  7. #define pii         pair<int,int>
  8. #define vi          vector<int>
  9. #define all(a)      (a).begin(),(a).end()
  10. #define lol         1000000007
  11. #define endl        '\n'
  12. #define rep(i,a,b)  for(int i=a;i<b;i++)
  13. #define SIZE        50000
  14. using namespace std;
  15.  
  16.  
  17.  
  18. void MOD(ll &x)
  19. {
  20.     if (x >= lol) x -= lol;
  21.     if (x < 0) x += lol;
  22. }
  23.  
  24.  
  25.  
  26. struct segtree
  27. {
  28.     ll maxsubsum;
  29.     ll sum;
  30.     ll maxprefsum;
  31.     ll maxsufsum;
  32. };
  33.                                     //////////////////////////////////////
  34. ll arr[SIZE+5];
  35. segtree tree[4*SIZE+5];     //arr and tree are both 1-indexed//
  36. int n, q;                           //////////////////////////////////////
  37.  
  38.  
  39.  
  40.  
  41. void build(int node, int start, int end)
  42. {
  43.     if(start==end)
  44.     {
  45.         tree[node].maxsubsum = arr[start];
  46.         tree[node].sum = arr[start];
  47.         tree[node].maxprefsum = arr[start];
  48.         tree[node].maxsufsum = arr[start];
  49.     }
  50.     else
  51.     {
  52.         int mid = (start+end)/2;
  53.         build(2*node, start, mid);
  54.         build(2*node+1, mid+1, end);
  55.        
  56.         //tree[node].sum=tree[node].maxprefsum=LLONG_MIN;
  57.         //tree[node].maxsufsum=tree[node].maxsubsum=LLONG_MIN;
  58.    
  59.         tree[node].sum = tree[2*node].sum + tree[2*node+1].sum;
  60.         tree[node].maxprefsum = max(tree[2*node].maxprefsum, tree[2*node].sum + tree[2*node+1].maxprefsum);
  61.         tree[node].maxsufsum = max(tree[2*node+1].maxsufsum, tree[2*node+1].sum + tree[2*node].maxsufsum);
  62.         tree[node].maxsubsum = max(tree[2*node].maxsubsum , max(tree[2*node+1].maxsubsum, tree[2*node].maxsufsum + tree[2*node+1].maxprefsum));         //CHANGES ACCORDING TO QUERY
  63.     }
  64. }
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71. segtree query(int node, int start, int end, int l, int r)
  72. {
  73.     segtree result;
  74.     result.sum=result.maxprefsum=LLONG_MIN;
  75.     result.maxsufsum=result.maxsubsum=LLONG_MIN;
  76.     if(r<start || end<l)        //range of node is completely outside given range
  77.     {
  78.         return result;
  79.     }
  80.     if(l<=start && end<=r)      // range of node is completely inside given range
  81.     {
  82.         return tree[node];
  83.     }
  84.  
  85.     int mid = (start+end)/2;        //range of node is partially inside and partially outside the given range
  86.    
  87.     if (l > mid)
  88.       return query(2*node+1, mid+1, end, l, r);
  89.     if (r <= mid)
  90.       return query(2*node, start, mid, l, r);
  91.  
  92.    
  93.     segtree p1 = query(2*node, start, mid, l, r);
  94.     segtree p2 = query(2*node+1, mid+1, end, l, r);
  95.  
  96.     result.sum = p1.sum + p2.sum;
  97.     result.maxprefsum = max(p1.maxprefsum, p1.sum + p2.maxprefsum);
  98.     result.maxsufsum = max(p2.maxsufsum, p2.sum + p1.maxsufsum);
  99.     result.maxsubsum = max(p1.maxsubsum , max(p2.maxsubsum, p1.maxsufsum + p2.maxprefsum));         //CHANGES ACCORDING TO QUERY
  100.  
  101.     return result;          //CHANGES ACCORDING TO QUERY
  102. }
  103.  
  104.  
  105.  
  106.  
  107.  
  108. void solve()
  109. {
  110.     cin>>n;
  111.     rep(i,1,n+1)
  112.     {
  113.         cin>>arr[i];
  114.     }
  115.     build(1,1,n);
  116.     cin>>q;
  117.     rep(i,1,q+1)
  118.     {
  119.         int x, y;
  120.         cin>>x>>y;
  121.         segtree ans = query(1,1,n,x,y);
  122.         cout<<ans.maxsubsum<<endl;
  123.     }
  124.  
  125. }
  126.  
  127.  
  128. int main()
  129. {
  130.     ios_base::sync_with_stdio(false);
  131.     cin.tie(0);
  132.     cout.tie(0);
  133.     int t=1;
  134.     cin>>t;
  135.     while(t--){
  136.         solve();
  137.     }
  138.     return 0;
  139. }
Add Comment
Please, Sign In to add comment