#include<set>
#include<iostream>
using namespace std;
typedef unsigned int ui;
const int N=9999999;
int n,t1,t2,t3,tp,a,b,k;
ui zh[N],fu[N];
set<int> ss;
inline void add(int cnt,int pos,int val)
{
if(val>0)
{
ui ji=(val>>(31-pos)),pre=zh[cnt];
ji>>=1;zh[cnt]+=(val<<pos);ji+=(pre>zh[cnt]);
if(zh[cnt]!=fu[cnt])ss.insert(cnt);
else if(ss.find(cnt)!=ss.end())ss.erase(cnt);
cnt++;
while(ji)
{
pre=zh[cnt];zh[cnt]+=ji;ji=(pre>zh[cnt]);
if(zh[cnt]!=fu[cnt])ss.insert(cnt);
else if(ss.find(cnt)!=ss.end())ss.erase(cnt);
cnt++;
}
}
else if(val<0)
{
val=-val;
ui ji=(val>>(31-pos)),pre=fu[cnt];
ji>>=1;fu[cnt]+=(val<<pos);ji+=(pre>fu[cnt]);
if(zh[cnt]!=fu[cnt])ss.insert(cnt);
else if(ss.find(cnt)!=ss.end())ss.erase(cnt);
cnt++;
while(ji)
{
pre=fu[cnt];fu[cnt]+=ji;ji=(pre>fu[cnt]);
if(zh[cnt]!=fu[cnt])ss.insert(cnt);
else if(ss.find(cnt)!=ss.end())ss.erase(cnt);
cnt++;
}
}
}
inline int query(int cnt,int pos)
{
int v1=(zh[cnt]%(1<<pos)),v2=(fu[cnt]%(1<<pos)),ans=((zh[cnt]>>pos)^(fu[cnt]>>pos))&1;
if(v1<v2)return (ans^1);
if(v1>v2 or ss.empty() or cnt<=*(ss.begin())){return ans;}
set<int>::iterator it=ss.lower_bound(cnt); --it;
if(zh[*it]>fu[*it])return ans;
return (ans^1);
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>t1>>t2>>t3;
while(n--)
{
cin>>tp;
switch(tp)
{
case 1:{cin>>a>>b;add(b>>5,b-((b>>5)<<5),a);break;}
default:{cin>>k;cout<<query(k>>5,k-((k>>5)<<5))<<endl;break;}
}
}
}