import std.stdio;
import std.conv, std.array, std.algorithm, std.string;
import std.math, std.random, std.range, std.datetime;
import std.bigint;
string read(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }

void main(){
	int n = read.to!int;
	long l = read.to!long;
	long t = read.to!long;
	
	long[] xs1, xs2;
	for(int i = 0; i < n; i ++){
		long x = read.to!long;
		int w = read.to!int;
		if(w == 1) xs1 ~= x;
		else xs2 ~= x;
		}
	
	debug writeln("xs1 ", xs1);
	debug writeln("xs2 ", xs2);
	
	// 行先(すり抜ける場合)
	long[] ys1, ys2;
	foreach(x; xs1) ys1 ~= (x + t) % l;
	foreach(x; xs2) ys2 ~= ((x - t) % l + l) % l;
	
	debug writeln("ys1 ", ys1);
	debug writeln("ys2 ", ys2);
	
	// すり抜けアリが何周するか？
	long d = t / l;
	long r = t % l;
	
	debug writeln("d ", d);
	debug writeln("r ", r);
	
	// すり抜けずに反射する場合、
	// アリたちの円環上での位置関係はかわらない。
	// よって1個のアリについてどこへ行くか調べればよい。
	
	// 0以上で0に最も近い位置にいるアリは誰か？
	
	// これがかわるのは0をまたぐアリがいた時
	
	// 正向きで0をまたぐ回数と、負向きで0をまたぐ回数の差し引き
	// (t / l) * #(x in xs1) + #(y in ys1 where y < r)
	// (t / l) * #(x in xs2) + #(y in ys2 where y > n - r)
	
	long c1 = ((t / l) % n) * xs1.length;
	foreach(y; ys1) if(y < r) c1 += 1;
	long c2 = ((t / l) % n) * xs2.length;
	foreach(y; ys2) if(y > l - r) c2 += 1;
	long c = ((c1 - c2) % n + n) % n;
	
	debug writeln("c1 ", c1);
	debug writeln("c2 ", c2);
	debug writeln("c ", c);
	
	// 0以上で0に最も近い位置にいるアリがわかれば、あとは自動的にわかる
	long[] ys = ys1 ~ ys2;
	ys.sort();
	
	debug writeln("ys ", ys);
	
	long[] ans;
	for(int i = 0; i < cast(int)(n - c); i ++) ans ~= ys[cast(int)(i + c)];
	for(int i = cast(int)(n - c); i < n; i ++) ans ~= ys[cast(int)(i + c - n)];
	
	foreach(a; ans) a.writeln;
	}