Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {

	sc := bufio.NewScanner(os.Stdin)
	sc.Scan()
	args := strings.Split(sc.Text(), " ")
	n, _ := strconv.Atoi(args[0])
	t, _ := strconv.ParseInt(args[1], 10, 64)

	q, _ := strconv.Atoi(args[2])

	pos := make([]int64, n)
	direction := make([]bool, n)

	for i := 0; i < n; i++ {
		sc.Scan()
		args = strings.Split(sc.Text(), " ")

		pos[i], _ = strconv.ParseInt(args[0], 10, 64)
		q, _ := strconv.Atoi(args[1])
		if q == 1 {
			direction[i] = true
		}
	}

	qq := make([]int, q)
	for i := 0; i < q; i++ {
		sc.Scan()
		args = strings.Split(sc.Text(), " ")

		qq[i], _ = strconv.Atoi(args[0])
	}

	ans(n, q, t, pos, direction, qq)

}

func ans(n, q int, t int64, pos []int64, dir []bool, qq []int) {

	colleation := []int64{} // syoutotu positon

	for i := 1; i < n; i++ {
		if dir[i-1] == dir[i] {
			continue
		}
		colleation = append(colleation, (pos[i-1]+pos[i])/2)

	}
	//fmt.Println(colleation)
	for i := 0; i < q; i++ {
		var ans int64
		ans = int64(-9999999)
		if dir[qq[i]-1] == true {
			// 東向きなら現ポジから＋方向で一番近い衝突点との距離を求めて、Tとの差が
			for _, v := range colleation {
				if v <= pos[qq[i]-1] {
					continue
				} else {
					// 衝突予定点が確定。衝突点との距離がT以下なら衝突点で停止
					if v-pos[qq[i]-1] <= t {
						ans = v
					} else {
						ans = pos[qq[i]-1] + int64(t)
					}
					break
				}
			}
			if ans == -9999999 {
				ans = pos[qq[i]-1] + int64((t))
			}

		} else {
			// nishi向きなら現ポジから-方向で一番近い衝突点との距離を求めて、Tとの差が
			for j := len(colleation); j > 0; j-- {
				if colleation[j-1] >= pos[qq[i]-1] {
					continue
				}
				v := colleation[j-1]
				//fmt.Printf("hoge=%d\n", v)
				// 衝突予定点が確定
				if pos[qq[i]-1]-v <= t {
					ans = v
				} else {
					ans = pos[qq[i]-1] - int64((t))
				}
				break

			}
			if ans == -9999999 {
				ans = pos[qq[i]-1] - int64((t))
			}

		}
		fmt.Printf("%d\n", ans)

	}

}

C++: #include<bits/stdc++.h>
using namespace std;
long long n,t,q;
long long a[100001],b[100001],ans[100001];
bool v[100001],tecked[100001]={};
long long teckb(long long k){
	if(tecked[k]){
		return ans[k];
	}
	tecked[k]=true;
	if(k<=0){
		return ans[k]=b[k];
	}
	if(v[k-1]){
		return ans[k]=max(b[k],(b[k]+b[k-1])/2);
	}
	return ans[k]=max(b[k],teckb(k-1));
}
long long teck(long long k){
	//cout<<k<<'k';
	if(tecked[k]){
		//cout<<"tecked"<<endl;
		return ans[k];
	}
	tecked[k]=true;
	if(k>=n-1){
		//cout<<'b';
		return ans[k]=b[k];
	}
	if(!v[k+1]){
		//cout<<'a'<<b[k-1]<<b[k];
		return ans[k]=min(b[k],(b[k]+b[k+1])/2);
	}
	//cout<<'k';
	return ans[k]=min(b[k],teck(k+1));
}
int main(){
	int w;
	cin>>n>>t>>q;
	for(int i=0;i<n;i++){
		cin>>a[i];
		cin>>w;
		if(w==1){
			b[i]=a[i]+t;
			v[i]=true;
		}else if(w==2){
			b[i]=a[i]-t;
			v[i]=false;
		}
		tecked[i]=false;
	}
	//for(int i=0;i<n;i++){
	//	cout<<i<<" a"<<a[i]<<" b"<<b[i]<<endl;
	//}
	for(int i=0;i<q;i++){
		cin>>w;
		w--;
		if(v[w]){
			cout<<teck(w)<<endl;
		}else{
			cout<<teckb(w)<<endl;
		}
	}
	//for(int i=0;i<n;i++){
	//	cout<<"i"<<i<<" a"<<a[i]<<" b"<<b[i]<<" ans"<<ans[i];
	//	if(v[i]){
	//		cout<<"left"<<endl;
	//	}else{
	//		cout<<"right"<<endl;
	//	}
	//}
}

C++: /*
JOI国のお散歩事情
<問題>
JOI 国には東西に走る 1 本の十分に長い道路がある．JOI 国の王宮が道路沿いにあり，
JOI 国における道路沿いの位置は整数 A で表される．A = 0 のときは王宮の位置を表す．
A > 0 のときは，王宮から東へ A メートル進んだ位置を表す．
A < 0 のときは，王宮から西へ -A メートル進んだ位置を表す．
JOI 国の道路沿いには N 軒の家があり，家には西から順に 1 から N までの番号が付けられている．
JOI 国には N 人の国民がいて，国民には 1 から N までの番号が付けられている．
家 i には国民 i が住んでいる．家 i の位置は
 0 でない偶数 Ai で表される．A1, ..., AN は全て異なる．
JOI 国では，近年国民の運動不足が問題になっている．
国民の健康が気になった JOI 国の王様は，国民全員に散歩をする命令を出した．
王様が命令を出すと，全ての国民は一斉に東向きまたは西向きに歩き始める．
それぞれの国民がどちらの向きに歩き始めるかは，国民ごとに決まっている．
全ての国民は，歩くときは 1 秒あたり 1 メートルの速度で歩く．
JOI 国の国民は皆おしゃべりが大好きである．散歩の途中にほかの国民に出会うと，
その場所で立ち止まって世間話を始めてしまう．
すでに立ち止まっている国民に出会った場合も同様である．一度立ち止まった国民は，再び歩き出すことはない．
JOI 国には Q 人の重要人物がいる．JOI 国の王様は，命令が出されてから T 秒後の，
Q 人の重要人物の位置を把握しておきたい．
命令が出されてから T 秒後の，Q 人の重要人物の位置を求めるプログラムを作成せよ．
<入力>
入力は，1 + N + Q 行からなる．

1 行目には，3 つの整数 N，T，Q (1 ≦ N ≦ 100000 (= 105),0 ≦ T ≦ 10の18乗, 
1 ≦ Q ≦ 1000，1 ≦ Q ≦ N) が空白を区切りとして書かれている．
これは ，JOI 国に家が N 軒あり，王様が命令を出してから T 秒後の，
Q 人の重要人物の位置を把握しておきたいことを表す．
続く N 行のうち i 行目には，2 つの整数 Ai, Di (-1018 ≦ Ai ≦ 1018, Ai は 0 でない偶数, 
1 ≦ Di ≦ 2) が空白を区切りとして書かれている．
Ai は家 i の位置を表す偶数である．すべての i (1 ≦ i ≦ N - 1) について，Ai < Ai+1 を満たす．
Di は命令が出された後に国民 i が歩き始める方向を表す．Di = 1 のときは国民 i は東向きに歩き始める．
Di = 2 のときは国民 i は西向きに歩き始める．
続く Q 行のうち i 行目には，整数 Xi (1 ≦ Xi ≦ N) が書かれている．
これは，i 番目の重要人物が家 Xi に住んでいることを表す．
すべての i (1 ≦ i ≦ Q - 1) について，Xi < Xi+1 を満たす．
与えられる 5 つの入力データのうち，入力 1 では N ≦ 100，T ≦ 10000を満たす．
また，入力 2 では N ≦ 5000 を満たす．また，入力 3 では，
ある整数 M (1 ≦ M ≦ N - 1) があって，すべての i (1 ≦ i ≦ M) について Di = 1，
すべての j (M + 1 ≦ j ≦ N) について Dj = 2 を満たす．
また，入力 1，2，3 では，入力に与えられる整数の絶対値は 1000000000 (= 109) を超えない．
入力 4，5 では，与えられる整数が 32 ビット符号付き整数の範囲に収まらないことに注意せよ．
*/

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
//dat["立ち止まる位置"]
long long dat[100010];
//vec[]
long long vec[100010][2];
int main(void){
	int num,query,i,j,z,zb;
	long long t,tt,za;
	i=0;
	cin>>num>>t>>query;
	vec[0][0]=-3000000000000000000LL;
	vec[0][1]=1;
	for(;i<num;i++){
		cin>>za>>zb;
		vec[i+1][0]=za;
		vec[i+1][1]=zb;
	}
	vec[num+1][0]=3000000000000000000LL;
	vec[num+1][1]=2;
	i=0;
	for(;i<=num;i++)
	{
		if(vec[i][1]==1&&vec[i+1][1]==2)
		{
			tt=(vec[i][0]+vec[i+1][0])/2;
			j=i;
			for(;j>=0;j--){
				if(vec[j][1]==1){
					dat[j]=tt;
				}
				else{
					break;
				}
			}
			j=i+1;
			for(;j<num+2;j++){
				if(vec[j][1]==2)
				{
					dat[j]=tt;
				}
				else{
					break;
				}
			}
		}
	}
	i=0;
	for(;i<query;i++){
		cin>>z;
		if(vec[z][1]==1){
			cout<<(vec[z][0]+t<dat[z]?(vec[z][0]+t):(dat[z]))<<endl;
		}
		else{
			cout<<(vec[z][0]-t<dat[z]?(dat[z]):(vec[z][0]-t))<<endl;
		}
	}
	return 0;
}
/*
#include<queue>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
stack<long long> q1;
stack<long long> q2;
int N=0,Q=0,T=0,D=0;
long long A[100010],syugou[1e9];
int main(void){
		cin>>N>>T>Q;
		for(int i=0;i<N;i++){
			cin>>A[i]>>D[i];
			if(D==1){
				q1.push(A[i]);
			}
			else
			{
				q2.push(A[i]);
			}
			if(q1.empty()==0&&q2.empty()==0)
			{
				if(D[i]==1)
				{
					syugou[i]=q1.top();
					syugou[i-1]=q2.top();
					while
					{
						
					}
				}
			}
		}
		return 0;
}*/

C++: #include<stdio.h>
long long t,tt;
long long a[100001],s[100001];
int b[100001],flg[100001];
int main(void)
{
	int n,q,i,j,c[1000],x;
	scanf("%d %lld %d",&n,&t,&q);
	for(i=1;i<=n;i++){
		scanf("%lld %d",&a[i],&b[i]);
		flg[i]=0;
	}	
	for(i=1;i<=q;i++)	scanf("%d",&c[i]);
	for(i=1;i<n;i++){
		if(b[i]==1&&b[i+1]==2&&a[i+1]-a[i]<t*2){
			flg[i]=1; flg[i+1]=1;
			s[i]=s[i+1]=(a[i]+a[i+1])/2;
		}
	}
	x=0;
	for(i=n;i>=1;i--){
		if(flg[i]==1){
			tt=s[i];	x=1;
		}
		else{
			if(b[i]==1&&x==1&&a[i]+t>tt){
				s[i]=tt;	flg[i]=2;
			}
		}
	}
	x=0;
	for(i=1;i<=n;i++){
		if(flg[i]==1){
			tt=s[i];	x=1;
		}
		else{
			if(b[i]==2&&x==1&&a[i]-t<tt){
				s[i]=tt;	flg[i]=2;
			}
		}
	}
	for(i=1;i<=q;i++){
		if(flg[c[i]]==0){
			if(b[c[i]]==1) s[c[i]]=a[c[i]]+t;
			else s[c[i]]=a[c[i]]-t;
		}
	}	
	for(i=1;i<=q;i++) printf("%lld\n",s[c[i]]);
}