#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int m,p,T;
cin>>m>>p>>T;
int A=0;
auto get=[&](int x)->int{
if(T==1)
return A^x;
return x;
};
vector<set<pair<int,int>>>arr(m+1);
vector<int>arr2(m+1);
for(auto&a:arr){
a.insert(make_pair(-1,-1));
}
int cnt=1,id=0;
for(int i=1;i<=m;i++){
int op;
cin>>op;
if(op==1){
int x;
cin>>x;
x=get(x);
if(x>0){
arr[cnt++].insert(make_pair(i,id));
arr2[id++]=x;
}
else{
arr[--cnt].insert(make_pair(i,-1));
}
}
else if(op==2){
int s,l,r,y;
cin>>s>>l>>r>>y;
y=get(y);
for(int i=l;i<=r;i++){
auto it=arr[i].upper_bound(make_pair(s,0));
if(it==arr[i].end()||it->first!=s)
--it;
if(it->second!=-1){
arr2[it->second]=(ll)arr2[it->second]*y%p;
}
}
}
else{
int s,l,r;
cin>>s>>l>>r;
ll res=0;
for(int i=l;i<=r;i++){
auto it=arr[i].upper_bound(make_pair(s,0));
if(it==arr[i].end()||it->first!=s)
--it;
if(it->second!=-1){
res=(res+arr2[it->second])%p;
}
}
cout<<res<<endl;
A=res;
}
}
return 0;
}
使用两个数据结构vector<set<pair<int,int>>>arr(m+1)维护每天的信息(pair存储第几天这个位置是谁),查找时可以根据天数二分查找。vector<int>arr2(m+1)维护队员的具体能力值,在操作2中计算,操作三查询。
主要的灵境在于没有很好支持范围操作,只能适用于r-l比较小的数据