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;

#define int long long
#define PB push_back
#define PPB pop_back
#define ALL(X) (X).begin(),(X).end()
typedef pair<int, int> pii;

static const int INF = 1LL << 61;
static const int MAX_N = 100005;

int n, t, A[MAX_N], D[MAX_N], pos[MAX_N], q, X[1005];
int stop[MAX_N];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    fill(stop, stop + MAX_N, INF);
    cin >> n >> t >> q;
    for (int i = 1; i <= n; ++i) {
        cin >> A[i] >> D[i];
    }
    for (int i = 0; i < q; ++i) {
        cin >> X[i];
    }

    for (int i = 2; i <= n; ++i) {
        if (D[i - 1] < D[i]) {
            int temp = (A[i - 1] + A[i]) / 2;
            stop[i - 1] = stop[i] = temp;
        }
    }

    for (int i = 1; i <= n; ++i) {
        if (stop[i] != INF && D[i] == 2) {
            int pos = stop[i];

            for (i = i + 1; D[i] == 2; ++i) {
                if (pos < A[i] - t) {
                    stop[i] = A[i] - t;
                } else {
                    stop[i] = pos;
                }
            }
        }
    }
    for (int i = n; 0 < i; --i) {
        if (stop[i] != INF && D[i] == 1) {
            int pos = stop[i];

            for (i = i - 1; D[i] == 1; --i) {
                if (A[i] + t < pos) {
                    stop[i] = A[i] + t;
                } else {
                    stop[i] = pos;
                }
            }
        }
    }

    for (int i = 0; i < q; ++i) {
        if (stop[X[i]] != INF) {
            cout << stop[X[i]] << endl;
        } else {
            if (D[i] == 1) {
                cout << A[X[i]] + t << endl;
            } else {
                cout << A[X[i]] - t << endl;
            }
        }
    }
}

C++: #include <bits/stdc++.h>
using namespace std;

int main(void){
    int n,q;
    long long t;
    cin>>n>>t>>q;
    vector<pair<int,int> >c(n);
    vector<int> ans;
    for (int i = 0; i < n; ++i) {
        cin>>c[i].first>>c[i].second;
        if(c[i].second==2)c[i].second=-1;
    }
    for (int i = 0; i < n; ++i) {
        if(c[i].second!=c[i+1].second)ans.push_back((c[i].first+c[i+1].first)/2);
    }
    for (int i = 0; i < q; ++i) {
        int a;
        cin>>a;a=a-1;
        for (int j = 0; j < ans.size(); ++j) {
            if(c[a].second==1){
                if(c[a].first<ans[j]){
                    if(abs(ans[j]-c[a].first)<t){cout<<ans[j]<<endl;break;}
                    else {long long an=t*c[a].second+c[a].first;cout<<an<<endl;break;}
                }
            }
            else {
                if(c[a].first>ans[j]){
                    if(abs(ans[j]-c[a].first)<t){cout<<ans[j]<<endl;break;}
                    else {long long an=t*c[a].second+c[a].first;cout<<an<<endl;break;}
                }
            }
        }
    }
    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(i+1<=n){
			if(b[i]==1&&b[i+1]==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>=1;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<=n;i++){
		if(flg[i]==0){
			if(b[i]==1) s[i]=a[i]+t;
			else s[i]=a[i]-t;
		}
	}	
	for(i=1;i<=q;i++) printf("%lld\n",s[c[i]]);
}

C++: #include<stdio.h>


int main() {
	int N, T, Q, flag = 0;
	int A[100000], D[100000], X[100000];
	scanf("%d %d %d", &N, &T, &Q);
	for (int i = 1; i <= N; i++) {
		scanf("%d %d", &A[i], &D[i]);
	}
	for (int i = 1; i <= Q; i++) {
		scanf("%d", &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("%d\n", (A[j-1] + A[j]) / 2);
						flag = 1;
					}
					break;
				}
			}
			if (flag == 0) {
				printf("%d\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("%d\n", (A[j+1] + A[j]) / 2);
						flag = 1;
					}
					break;
				}
			}
			if (flag == 0) {
				printf("%d\n", A[X[i]] - T);
			}
	    }
		flag = 0;
    }
	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 = false;
			for (LL 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;
							meetFlag = true;
						}
						eastFlag = false;
					}
				}
				else
				{
					if (D[j] == 1)
					{
						if (meetFlag) { list.push_back(group{ i,j - 1,p }); }
						meetFlag = false;
						i = j - 1;
						break;
					}
				}
				if (j == N - 1 && meetFlag)
				{
					list.push_back(group{ i,j,p });
					break;
				}
			}
		}
	}
	int seek = 0;
	rep(i, N)
	{
		if (seek < (signed)list.size())
		{
			if (list[seek].begin <= i && i <= list[seek].end)
			{
				if (abs(A[i] - list[seek].pos) <= 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;
}