Advertisement
ThegeekKnight16

Green Line Yan

Jul 13th, 2022
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5.  
  6. const int maxn = 100010;
  7.  
  8. int n, q;
  9.  
  10. ll ans[maxn];
  11. ll a[maxn], t[maxn];
  12.  
  13. int x[maxn];
  14.  
  15. vector<pair<ll,int>> sweep[maxn];
  16.  
  17. void calculate()
  18. {
  19.     for(int i = 1 ; i <= q ; i++)
  20.         sweep[ x[i] ].push_back( { t[i] , i } );
  21.  
  22.     vector<ll> pSum;
  23.     vector<pair<ll,ll>> evTimes;
  24.  
  25.     for(int i = 1 ; i <= n ; i++)
  26.     {
  27.         if( a[i - 1] > a[i] )
  28.         {
  29.             ll lT = 1, rT = a[i - 1] - a[i];
  30.  
  31.             while( !evTimes.empty() )
  32.             {
  33.                 auto [lLast, rLast] = evTimes.back();
  34.                 lLast += i - 1; rLast += i - 1;
  35.  
  36.                 if( rT + 1 <= lLast )
  37.                     break;
  38.  
  39.                 rT += rLast - lLast + 1;
  40.  
  41.                 pSum.pop_back();
  42.                 evTimes.pop_back();
  43.             }
  44.  
  45.             evTimes.emplace_back( lT - i , rT - i );
  46.  
  47.             if( pSum.empty() )
  48.                 pSum.push_back( rT - lT + 1 );
  49.             else
  50.                 pSum.push_back( pSum.back() + rT - lT + 1 );
  51.         }
  52.         else
  53.         {
  54.             ll s = a[i - 1];
  55.  
  56.             while( !evTimes.empty() )
  57.             {
  58.                 auto [lLast, rLast] = evTimes.back();
  59.                 lLast += i - 1; rLast += i - 1;
  60.                 ll diff = rLast - lLast + 1;
  61.  
  62.                 if( s + diff > a[i] )
  63.                 {
  64.                     evTimes.back().first += a[i] - s;
  65.                     pSum.back() -= a[i] - s;
  66.                     break;
  67.                 }
  68.  
  69.                 s += diff;
  70.  
  71.                 pSum.pop_back();
  72.                 evTimes.pop_back();
  73.             }
  74.         }
  75.  
  76.         while( !sweep[i].empty() )
  77.         {
  78.             auto [cT, id] = sweep[i].back();
  79.             sweep[i].pop_back();
  80.  
  81.             if( cT == 0 || evTimes.empty() )
  82.             {
  83.                 ans[id] = max( ans[id] , a[i] );
  84.                 continue;
  85.             }
  86.  
  87.             if( evTimes[0].second + i <= cT )
  88.             {
  89.                 ans[id] = max( ans[id] , a[i] + pSum.back() );
  90.                 continue;
  91.             }
  92.  
  93.             int l = 0, r = (int)evTimes.size() - 1;
  94.  
  95.             while( l < r )
  96.             {
  97.                 int mid = ( l + r )/2;
  98.                 if( l == r - 1 ) mid = r;
  99.  
  100.                 if( evTimes[mid].second + i > cT )
  101.                     l = mid;
  102.                 else
  103.                     r = mid - 1;
  104.             }
  105.  
  106.             ll curAns;
  107.  
  108.             if( cT < evTimes[l].first + i )
  109.                 curAns = pSum.back() - pSum[l];
  110.             else
  111.                 curAns = pSum.back() - pSum[l] + ( cT - evTimes[l].first - i + 1 );
  112.  
  113.             ans[id] = max( ans[id] , a[i] + curAns );
  114.         }
  115.     }
  116. }
  117.  
  118. int main()
  119. {
  120.     scanf("%d %d",&n,&q);
  121.  
  122.     for(int i = 1 ; i <= n ; i++)
  123.         scanf("%lld",&a[i]);
  124.  
  125.     for(int i = 1 ; i <= q ; i++)
  126.         scanf("%d %lld",&x[i],&t[i]);
  127.  
  128.     calculate();
  129.  
  130.     reverse( a + 1 , a + n + 1 );
  131.  
  132.     for(int i = 1 ; i <= q ; i++)
  133.         x[i] = n - x[i] + 1;
  134.  
  135.     calculate();
  136.  
  137.     for(int i = 1 ; i <= q ; i++)
  138.         printf("%lld\n",ans[i]);
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement