Advertisement
Saleh127

Toph - maximum-distance / Segment Tree

Apr 14th, 2022
882
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1. ///Problem Link - "https://toph.co/p/maximum-distance"
  2.  
  3. /***
  4.  created: 2022-04-14-21.52.40
  5. ***/
  6. a
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9. #define ll long long
  10. #define test int t; cin>>t; for(int cs=1;cs<=t;cs++)
  11. #define nl '\n'
  12.  
  13. ll a[100005],s[100005],p[100005];
  14. pair<ll,ll> tree[400005];
  15. pair<ll,ll> tree1[400005];
  16. pair<ll,ll> tree2[400005];
  17. pair<ll,ll> tree3[400005];
  18.  
  19. void treeconstruct(ll node,ll b,ll e)
  20. {
  21.     if(b==e)
  22.     {
  23.         tree[node]={p[b],b};
  24.         tree1[node]={p[b],b};
  25.         return;
  26.     }
  27.  
  28.     ll left = node*2;
  29.     ll right = node*2 + 1ll;
  30.  
  31.     ll mid=(b+e)/2;
  32.  
  33.     treeconstruct(left,b,mid);
  34.     treeconstruct(right,mid+1,e);
  35.  
  36.     tree[node]=min(tree[left],tree[right]);
  37.  
  38.     tree1[node]=max(tree1[left],tree1[right]);
  39.  
  40. }
  41.  
  42.  
  43. void treeconstruct1(ll node,ll b,ll e)
  44. {
  45.     if(b==e)
  46.     {
  47.         tree2[node]={s[b],b};
  48.         tree3[node]={s[b],b};
  49.         return;
  50.     }
  51.  
  52.     ll left = node*2;
  53.     ll right = node*2 + 1ll;
  54.  
  55.     ll mid=(b+e)/2;
  56.  
  57.     treeconstruct1(left,b,mid);
  58.     treeconstruct1(right,mid+1,e);
  59.  
  60.     tree2[node]=min(tree2[left],tree2[right]);
  61.  
  62.     tree3[node]=max(tree3[left],tree3[right]);
  63.  
  64. }
  65.  
  66.  
  67. pair<ll,ll> queries(ll node,ll b,ll e,ll i,ll j)
  68. {
  69.     if(i>e || j<b) return {1e17,0};
  70.  
  71.     if(b>=i && e<=j) return tree[node];
  72.  
  73.     ll left = node*2;
  74.     ll right = node*2 + 1ll;
  75.  
  76.     ll mid=(b+e)/2;
  77.  
  78.     return min(queries(left,b,mid,i,j),queries(right,mid+1,e,i,j));
  79. }
  80.  
  81.  
  82. pair<ll,ll> queries1(ll node,ll b,ll e,ll i,ll j)
  83. {
  84.     if(i>e || j<b) return {-1e17,0};
  85.  
  86.     if(b>=i && e<=j) return tree1[node];
  87.  
  88.     ll left = node*2;
  89.     ll right = node*2 + 1ll;
  90.  
  91.     ll mid=(b+e)/2;
  92.  
  93.     return max(queries1(left,b,mid,i,j),queries1(right,mid+1,e,i,j));
  94. }
  95.  
  96.  
  97. pair<ll,ll> queries2(ll node,ll b,ll e,ll i,ll j)
  98. {
  99.     if(i>e || j<b) return {1e17,0};
  100.  
  101.     if(b>=i && e<=j) return tree2[node];
  102.  
  103.     ll left = node*2;
  104.     ll right = node*2 + 1ll;
  105.  
  106.     ll mid=(b+e)/2;
  107.  
  108.     return min(queries2(left,b,mid,i,j),queries2(right,mid+1,e,i,j));
  109. }
  110.  
  111.  
  112. pair<ll,ll> queries3(ll node,ll b,ll e,ll i,ll j)
  113. {
  114.     if(i>e || j<b) return {-1e17,0};
  115.  
  116.     if(b>=i && e<=j) return tree3[node];
  117.  
  118.     ll left = node*2;
  119.     ll right = node*2 + 1ll;
  120.  
  121.     ll mid=(b+e)/2;
  122.  
  123.     return max(queries3(left,b,mid,i,j),queries3(right,mid+1,e,i,j));
  124. }
  125.  
  126.  
  127.  
  128. int main()
  129. {
  130.     ios_base::sync_with_stdio(0);
  131.     cin.tie(0);
  132.     cout.tie(0);
  133.  
  134.     test
  135.     {
  136.         ll n,m,i,j,k,l,q;
  137.  
  138.         cin>>n;
  139.  
  140.         for(i=1;i<=n;i++)
  141.         {
  142.             cin>>a[i];
  143.         }
  144.  
  145.         p[0]=0;
  146.         s[n+1]=0;
  147.  
  148.         for(i=1;i<=n;i++) p[i]=p[i-1]+a[i];
  149.         for(i=n;i>=0;i--) s[i]=s[i+1]+a[i];
  150.  
  151.         treeconstruct(1,1,n);
  152.         treeconstruct1(1,1,n);
  153.  
  154.         cin>>q;
  155.  
  156.         while(q--)
  157.         {
  158.             cin>>j>>k;
  159.  
  160.             auto x=queries(1,1,n,j,k);  // min prefix sum
  161.  
  162.             auto y=queries1(1,1,n,j,k); // max prefix sum
  163.  
  164.             auto z=queries2(1,1,n,j,k); // min suffix sum
  165.  
  166.             auto w=queries3(1,1,n,j,k); // min suffix sum
  167.  
  168.             ll ans1=abs(y.first - p[j-1] - z.first + s[k+1]);
  169.  
  170.             ll ans2=abs(x.first - p[j-1] - w.first + s[k+1]);
  171.  
  172.             if(ans1<ans2)
  173.             {
  174.                 cout<<x.second<<" "<<w.second<<nl;
  175.             }
  176.             else
  177.             {
  178.                 cout<<y.second<<" "<<z.second<<nl;
  179.             }
  180.         }
  181.     }
  182.  
  183.     return 0;
  184. }
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement