Advertisement
Morass

PLANTS

Sep 9th, 2016
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.07 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF (1<<29)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef long double ld;
  12. typedef pair<ll,ll> pll;
  13. typedef vector<int> vi;
  14. typedef pair<int,int> ii;
  15. typedef vector<ii> vii;
  16. #define IN(n) int n;scanf("%d",&n);
  17. #define FOR(i, m, n) for (int i(m); i < n; i++)
  18. #define REP(i, n) FOR(i, 0, n)
  19. #define F(n) REP(i, n)
  20. #define FF(n) REP(j, n)
  21. #define FT(m, n) FOR(k, m, n)
  22. #define aa first
  23. #define bb second
  24. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  25. #define LG (17)
  26. #define MX (1<<LG)
  27. #define P2(v) (!(v&(v-1)))
  28. struct RM{
  29.     int dp[MX][LG+2],G[MX],XX,O=-1;
  30.     void ini(int *A,int n){
  31.         if(!XX++)FT(1,MX)G[k]=O+=P2(k);
  32.         F(n)dp[i][0]=i;
  33.         FT(1,k-(1<<k)+n+1)F(n+1-(1<<k))
  34.             if(A[dp[i][k-1]]<A[dp[i+(1<<(k-1))][k-1]])
  35.                 dp[i][k]=dp[i][k-1];
  36.             else dp[i][k]=dp[i+(1<<(k-1))][k-1];
  37.     }
  38.     int qy(int *A,int L,int R){
  39.         int j(G[R-L+1]);
  40.         if(A[dp[L][j]]<=A[dp[R-(1<<j)+1][j]])
  41.             return A[dp[L][j]];
  42.         return A[dp[R-(1<<j)+1][j]];
  43.     }
  44. }M;
  45. struct RX{
  46.     int dp[MX][LG+2],G[MX],XX,O=-1;
  47.     void ini(int *A,int n){
  48.         if(!XX++)FT(1,MX)G[k]=O+=P2(k);
  49.         F(n)dp[i][0]=i;
  50.         FT(1,k-(1<<k)+n+1)F(n+1-(1<<k))
  51.             if(A[dp[i][k-1]]>A[dp[i+(1<<(k-1))][k-1]])
  52.                 dp[i][k]=dp[i][k-1];
  53.             else dp[i][k]=dp[i+(1<<(k-1))][k-1];      
  54.     }
  55.     int qy(int *A,int L,int R){
  56.         int j(G[R-L+1]);
  57.         if(A[dp[L][j]]>=A[dp[R-(1<<j)+1][j]])
  58.             return A[dp[L][j]];
  59.         return A[dp[R-(1<<j)+1][j]];
  60.     }
  61. }X;
  62. int A[MX],N,K,D,W,B;
  63. int main(void){
  64.     IN(tt)F(tt){
  65.         scanf("%d%d",&N,&K),assert(K>-1&&N>-1&&K<=1e5&&N<=1e5),ga(N,A),M.ini(A,N),X.ini(A,N),K=min(K+1,N-1),W+=N,B=0;
  66.         F(N-K)B=max(B,X.qy(A,i,i+K)-M.qy(A,i,i+K));
  67.         printf("%d\n",B);
  68.     }
  69.     assert(W<=3e6);
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement