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 <iostream>
#include <algorithm>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
int main() {
	long long int n, t;
	int q;
	cin >>n >>t >>q;
	vector<long long int> w;
	
	int home[100005] = { 0 };
	
	
	for (long long int i = 0; i < n; i++) {
		long long int a;
		cin >> a >> home[i];
		w.push_back(a);
	}
	
	int key[100005] = {0};
	for (int i = 0; i < q; i++) {
		int a;
		cin >> a;
		key[a - 1] = 1;
	}
	int west = 0;
	int east = 0;
	
	long long int east2 = 0;
	vector<long long int> talkpoint;
	long long int tp;
	for (long long int i = 0; i < n; i++) {
		if (i < 50000) {
			if (home[i]==2) {
				if (west==0) {
					
						long long int b = w[i] - t;
						talkpoint.push_back(b);
				
				}
				else {
					talkpoint.push_back(tp);
					
					east = 1;
				}
			}
			if (home[i]==1) {
				
					if (home[i + 1] == 2) {
						tp = (w[i] + w[i + 1]) / 2;
						for (long long int j = 0; j <= east2; j++) {
							talkpoint.push_back(tp);
						}
						west = 1;
						east2 = 0;
					}
					else if (i == n - 1) {
						long long int d = w[i] + t;
						talkpoint.push_back(d);
					}
					else {
						east2++;
						west = 1;
					}
				

			}

		}
	}
	for (long long int i = 0; i < n; i++) {
		if (key[i] == 1) {
			
			long long int e;
			if (talkpoint[i] < w[i]) {
				e = w[i] - talkpoint[i];
			}
			else {
				e = talkpoint[i] - w[i];
			}
			if (e <= t) {
				cout << talkpoint[i] << endl;
			}
			else {
				if (home[i] == 1) {
					cout << w[i] + t << endl;
				}
				else {
					cout << w[i] - t << endl;
				}
			}
		}
	}
	return 0;
}

C++: #include "bits/stdc++.h"
#define in std::cin
#define out std::cout
#define rep(i,N) for(LL i=0;i<N;++i)
typedef long long int LL;

struct group { LL begin, end, pos; };

LL N, T, Q, A[112345], D[112345], X[1123];
std::vector<group>list;

int main()
{
	in >> N >> T >> Q;
	rep(i, N) { in >> A[i] >> D[i]; }
	rep(i, Q) { in >> X[i]; }

	rep(i, N)
	{
		if (D[i] == 1)
		{
			LL p;
			bool eastFlag = true, meetFlag = true;
			for (int j = i; j < N; ++j)
			{
				if (eastFlag)
				{
					if (D[j] == 2)
					{
						if (A[j] - A[j - 1] <= T * 2) { p = (A[j] + A[j - 1]) / 2; }
						else { meetFlag = false; }
						eastFlag = false;
					}
				}
				else
				{
					if (D[j] == 1)
					{
						if (meetFlag) { list.push_back({ i,j - 1,p }); }
						i = j - 1;
						break;
					}
					if (j == N - 1)
					{
						if (meetFlag) { list.push_back({ i,j,p }); }
						i = j;
						break;
					}
				}
			}
		}
	}
	LL seek = 0;
	rep(i, N)
	{
		if (!list.empty())
		{
			if (list[seek].begin <= i && i <= list[seek].end)
			{
				if ((A[i] + list[seek].pos) / 2 <= T) { A[i] = list[seek].pos; }
				else { A[i] += (D[i] == 1 ? T : -T); }
			}
			else if (list[seek].end < i) { ++seek; --i; }
			else { A[i] += (D[i] == 1 ? T : -T); }
		}
		else
		{
			A[i] += (D[i] == 1 ? T : -T);
		}
	}

	rep(i, Q) { out << A[X[i] - 1] << std::endl; }
	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=q;i>0;i--){
		if(flg[c[i]]==1){
			tt=s[c[i]];	x=1;
		}
		else{
			if(b[c[i]]==1&&x==1&&a[c[i]]+t>tt){
				s[c[i]]=tt;	flg[c[i]]=2;
			}
		}
	}
	x=0;
	for(i=1;i<=q;i++){
		if(flg[c[i]]==1){
			tt=s[c[i]];	x=1;
		}
		else{
			if(b[c[i]]==2&&x==1&&a[c[i]]-t<tt){
				s[c[i]]=tt;	flg[c[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]]);
}

C++: #include<stdio.h>


int main() {
	int N, Q, flag = 0;
	long long int T,A[10000], D[10000], X[10000];
	scanf("%d %lld %d", &N, &T, &Q);
	for (int i = 1; i <= N; i++) {
		scanf("%lld %lld", &A[i], &D[i]);
	}
	for (int i = 1; i <= Q; i++) {
		scanf("%lld", &X[i]);
	}
	for (int i = 1; i <= Q; i++) {
		if (D[X[i]] == 1) {
			for (int j = X[i]+1; j <= N;j++) {
				if (D[j] == 2) {
					if ((A[j-1] + A[j]) / 2 <= A[X[i]] + T) {
						printf("%lld\n", (A[j-1] + A[j]) / 2);
						flag = 1;
					}
					break;
				}
			}
			if (flag == 0) {
				printf("%lld\n", A[X[i]] + T);
			}
		}
		if (D[X[i]] == 2) {
			for (int j = X[i] -1; j >=1; j--) {
				if (D[j] == 1) {
					if ((A[j+1] + A[j]) / 2 >= A[X[i]] - T) {
						printf("%lld\n", (A[j+1] + A[j]) / 2);
						flag = 1;
					}
					break;
				}
			}
			if (flag == 0) {
				printf("%lld\n", A[X[i]] - T);
			}
	    }
		flag = 0;
    }
	return 0;
}

C++: 
#include <cstdio>
#include <vector>

using namespace std;

using ll = long long;

const ll inf = 4e18;

ll n, t, q;
ll a[123456];
bool d[123456];
ll x[1000];
vector<ll> talkp;
ll place[123456];

inline ll mean(ll a, ll b) { return a/2 + b/2; }

int main()
{
	scanf("%lld %lld %lld", &n, &t, &q);
	a[0] = -inf; d[0] = true;
	for (int i = 1; i <= n; ++i)
	{
		int tmpd;
		scanf("%lld %d", a + i, &tmpd);
		d[i] = (tmpd == 1);
	}
	a[n + 1] = inf; d[n + 1] = false;
	for (int j = 0; j < q; ++j)
	{
		scanf("%lld", x + j);
	}
	for (int i = 0; i <= n; ++i)
	{
		if (d[i] && !d[i + 1])
		{
			talkp.push_back(mean(a[i], a[i + 1]));
		}
	}
	auto fritr = talkp.begin();
	auto bkitr = talkp.begin();

	for (int i = 0; i <= n; ++i)
	{
		place[i] = a[i];
		while (fritr != talkp.end() && (*fritr) < a[i])
		{
			bkitr = fritr;
			++fritr;
		}
		if (d[i])
		{
			ll dist = (*fritr) - a[i];
			if (dist < t)place[i] += dist;
			else place[i] += t;
		}
		else
		{
			ll dist = a[i] - (*bkitr);
			if (dist < t)place[i] -= dist;
			else place[i] -= t;
		}
	}
	for (int j = 0; j < q; ++j)
	{
		printf("%lld\n", place[x[j]]);
	}
	return 0;
}