按照官方题解改的在vector上二分就可以AC,非常迷。这份是在修改到qr时候的数组上查询点x的值。按道理来说是一样的啊((
我菜死了,主席树都写歪来,救救孩子qwq
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mid ((x+y)>>1)
using namespace std;
const int MAXN=1e5+5,MAXT=1e7;
int minval[MAXN];
int n,m,k,opt;
struct PresidentTree
{
int root[MAXT],lt[MAXT],rt[MAXT],a[MAXT],tot;
inline void Modify(int pre,int &pos,int p,int k,int x=1,int y=n)
{
if(!pos) pos=++tot;
if(x!=y)
{
if(p<=mid) Modify(lt[pre],lt[pos],p,k,x,mid),rt[pos]=rt[pre];
else Modify(rt[pre],rt[pos],p,k,mid+1,y),lt[pos]=lt[pre];
}
else a[pos]=k;
}
inline int Query(int pos,int p,int x=1,int y=n)
{
if(x!=y)
if(p<=mid) return Query(lt[pos],p,x,mid);
else return Query(rt[pos],p,mid+1,y);
return a[pos];
}
}PT;
signed main(void)
{
cin>>n>>m>>k>>opt;
for(int i=1,x,y;i<=m;i++)
{
scanf("%d %d",&x,&y);
if(x==1) continue;
if(y==1) minval[x]=i;
else minval[x]=max(minval[x],minval[y]);
PT.Modify(PT.root[i-1],PT.root[i],x,minval[x]);
}
for(int i=1,L=0,x,l,r;i<=k;i++)
{
scanf("%d %d %d",&x,&l,&r);
if(opt) x^=L,l^=L,r^=L;
if(x==1) {puts("1"),L++;continue;}
if(l<=PT.Query(PT.root[r],x)) puts("1"),L++;
else puts("0");
}
return 0;
}