#include using namespace std; long long nyh[1510101],cj[1510101],ans[1010111],tans=0,tn=0,m1; long long mod=998244353; long long poww(long long z,long long cs) { long long tans=1,d=z; while(cs) { if(cs%2) tans*=d; tans=tans%mod; cs/=2; d=d*d; d=d%mod; } return tans; } long long c(long long n,long long m) { return cj[n]*nyh[m]%mod*nyh[n-m]%mod; } long long s,s1,t; struct xing { long long n,m,w; }; bool operator < (xing a,xing b) { if(a.n/1000!=b.n/1000) { return a.n/1000>b.n/1000; } else { return a.m>b.m; } } priority_queue qe; void lr() { tans=tans*2-c(tn-1,m1-1); tans=(tans+mod)%mod; tn++; } void ll() { tn--; tans=(tans+c(tn-1,m1-1))*nyh[2]; tans=(tans+mod)%mod; } void rr() { m1++; tans=tans+c(tn-1,m1-1); tans=(tans+mod)%mod; } void rl() { tans=tans-c(tn-1,m1-1); tans=(tans+mod)%mod; m1--; } int main() { cin>>t; cj[0]=1; nyh[0]=1; for(int i=1; i<=360000; i++) { cj[i]=(cj[i-1]*i)%mod; nyh[i]=(nyh[i-1]*poww(i,mod-2))%mod; } for(int i=1; i<=t; i++) { cin>>s>>s1; qe.push({s,s1,i}); } tn=1; m1=1; tans=1; while(!qe.empty()) { while(tnqe.top().n) ll(); while(m1qe.top().m) rl(); tans=(tans+mod)%mod; ans[qe.top().w]=tans%mod*(poww(2,tn)-1)%mod; qe.pop(); } for(int i=1; i<=t; i++) { cout<