代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 1145141919810//"幸运"数字
#define int long long
#define mid (l+r)/2
int m,n,t1,t2,t3,t4,maxx=-INF;
struct REQUEST//记录异或请求
{
int x,y,z;
};
struct xy//区间
{
int x,y;
};
bool operator <(xy qwe,xy wer)//没啥用
{
return qwe.x<wer.x;
}
int tree[10001000],tag[10001000];//线段树
vector<int> node;//离散点,保存临时数组
vector<REQUEST> req;//记录异或请求
vector<xy> ans;//记录查询到的答案
map<int,int> mp;//映射前-》后
map<int,int> mp1;//映射后-》前
//线段树中INF代表区间内数不一致,为数代表区间内为一致的此数
void push_down(int k)
{
tag[k*2]^=tag[k];
tag[k*2+1]^=tag[k];
tag[k]=0;
if(tree[k*2]!=INF)tree[k*2]=tree[k*2]^tag[k*2];
if(tree[k*2+1]!=INF)tree[k*2+1]=tree[k*2+1]^tag[k*2+1];
}
void push_up(int k)
{
if(tree[k*2]==tree[k*2+1])tree[k]=tree[k*2];
else tree[k]=INF;
}
void txor(int k,int l,int r,int ll,int rr,int xr)//区间异或
{
// printf("%lld %lld %lld %lld %lld %lld\n",k,l,r,ll,rr,xr);
if(l>rr||r<ll)return;
if(l==r)
{
tree[k]^=xr;
return;
}
if(l>=ll&&r<=rr)
{
if(tree[k]!=INF)tree[k]^=xr;
tag[k]^=xr;
return;
}
//printf("52\n");
push_down(k);
//printf("53\n");
txor(k*2,l,mid,ll,rr,xr);
txor(k*2+1,mid+1,r,ll,rr,xr);
// printf("56\n");
push_up(k);
}
void findd(int k,int l,int r)//查询答案
{
if(l<r)
{
push_down(k);
findd(k*2,l,mid);
findd(k*2+1,mid+1,r);
return;
}
if(l==r)
{
if(tree[k]>maxx)
{
maxx=tree[k];
ans.clear();
ans.push_back({l,k});
}
if(tree[k]==maxx)
{
ans.push_back({l,k});
}
return;
}
}
signed main()
{
scanf("%lld",&m);
node.push_back(INF);
node.push_back(-INF);
for(int i=1;i<=m;++i)
{
scanf("%lld",&t1);
if(t1==1)
{
scanf("%lld%lld%lld",&t2,&t3,&t4);
node.push_back(t2);
node.push_back(t3);
req.push_back({t2,t3,t4});
}
if(t1==2)
{
scanf("%lld%lld",&t2,&t3);
node.push_back(t2);
node.push_back(t2+1);
node.push_back(t2-1);
req.push_back({t2,t2,t3});
}
if(t1==3)
{
scanf("%lld%lld",&t2,&t3);
node.push_back(t2);
node.push_back(t2+1);
node.push_back(t2-1);
req.push_back({-INF,t2-1,t3});
req.push_back({t2+1,INF,t3});
}
}
sort(node.begin(),node.end());
n=node.size();
// puts("");
for(int i=0;i<n;++i)
{
//printf("%lld %lld\n",i+1,node[i]);
mp[node[i]]=i+1;
mp1[i+1]=node[i];
}
// puts("");
for(auto i:req)
{
txor(1,1,n,mp[i.x],mp[i.y],i.z);
//for(int j=1;j<=30;++j)
//{
// printf("%lld %lld\n",j,tree[j]);
// }
}
findd(1,1,n);
printf("%lld ",maxx);
sort(ans.begin(),ans.end(),[](xy qwe,xy wer){return abs(mp1[qwe.x])<abs(mp1[wer.x]);});
if(ans.size()>1&&abs(mp1[ans[0].x])==abs(mp1[ans[1].x]))
printf("%lld",max(mp1[ans[0].x],mp1[ans[1].x]));
else printf("%lld",mp1[ans[0].x]);
return 0;
}