Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const ll mod= 1e9+7,INF=1e18,mx= 1e6+5,mn=100;
- int testCase=1,cas=0;
- int ar[mx];
- pii Tree[3*mx];
- void init(int node,int st,int en) {
- if(st==en) {
- Tree[node].first=ar[st];
- Tree[node].second=ar[st];
- return;
- }
- int Left = node << 1;
- int Right = Left | 1;
- int mid = (st + en) >> 1;
- init(Left,st,mid);
- init(Right,mid+1,en);
- Tree[node].first=max(Tree[Left].first,Tree[Right].first);
- Tree[node].second=min(Tree[Left].second,Tree[Right].second);
- }
- pii query(int node,int st,int en,int x,int y) {
- if(st>y || en<x)
- return {INT_MIN,INT_MAX};
- if(st>= x && en<=y) {
- return {Tree[node].first,Tree[node].second};
- }
- int Left = node << 1;
- int Right = Left | 1;
- int mid = (st + en) >> 1;
- pii a= query(Left,st,mid,x,y);
- pii b= query(Right,mid+1,en,x,y);
- int c= max(a.first,b.first);
- int d= min(a.second,b.second);
- return {c,d};
- }
- int main() {
- scanf("%d",&testCase);
- while(testCase--) {
- int n,d;
- scanf("%d %d",&n,&d);
- for(int i=1; i<=n; i++) {
- scanf("%d",&ar[i]);
- }
- init(1,1,n);
- int ans=0,lim=n-d;
- for(int i=1; i<=lim; i++) {
- pii x= query(1,1,n,i,i+d-1);
- ans=max(ans,x.first-x.second);
- }
- printf("Case %d: %d\n",++cas,ans);
- for(int i=0; i<mx; i++) {
- ar[i]=Tree[i].first=Tree[i].second=0;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment