intさわだんのBlack History

刹那的レジェンドになりたい。

POJ 2823 Sliding Window

昨日の夜POJ落ちてたが復旧していた。

SegmentTreeつかわなくてもできそうだが練習のため使用。

LanguageをG++ではTLEになったがC++にしたら通った。
POJの闇である。

#include <cstdio>
#include <climits>
#include <algorithm>
#include <utility>
#include <iostream>

//http://poj.org/problem?id=2823

using namespace std;

typedef pair<int,int> P;

int t[2100000];
int t2[2100000];
P ans[1000002];


int n,kn;

void init(){
    n = 1;
    while(n < kn)n *= 2;

    for(int i = 1;i < n * 2 - 1;i++){
	t[i] = INT_MIN;
	t2[i] = INT_MAX;
    }

}



void add(int a,int b){
    a += n - 1;
    t[a] = b;
    t2[a] = b;
    while(a > 0){
	a = (a-1) / 2;
	t[a] = max(t[a*2+1],t[a*2+2]);
	t2[a] = min(t2[a*2+1],t2[a*2+2]);
    }
}




P get(int a,int b,int v,int l,int r){
    if(a >= r || b <= l)return P(INT_MIN,INT_MAX);
    if(a <= l && r <= b)return P(t[v],t2[v]);
    else{
	P vl = get(a,b,v*2+1,l,(l+r)/2);
	P vr = get(a,b,v*2+2,(l+r)/2,r);
	return P(max(vl.first,vr.first),min(vl.second,vr.second));
    }
}


int main(){
    int k;

    while(cin >> kn >> k){
    init();
    for(int i = 0;i < kn;i++){
	int tmp;
	scanf("%d",&tmp);
	add(i,tmp);
    }
    for(int i = 0;i < kn-k+1;i++){
	ans[i] = get(i,i+k,0,0,n);
    }
    for(int i = 0;i < kn-k+1;i++){
	printf("%d ",ans[i].second);
    }



    printf("\n");


    for(int i = 0;i < kn-k+1;i++){
	printf("%d ",ans[i].first);
    }
    printf("\n");

    }


return 0;
}