总分 60+15+0=75 rank5
T1想主席树套树状数组,死活调不出来,后来发现内存炸了
交的30暴力+30静态主席树
T2暴力
T3 真心不会
目前只改了T1
正解:因为异或了opt,所以反解答案。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 200005
using namespace std;
int prime[100005],tot,id[1000005];
bool vis[1000005];
void init(){
for(int i=2;i<=1000000;i++){
if(!vis[i]){prime[++tot]=i;id[i]=tot;}
for(int j=1;j<=tot&&i*prime[j]<=1000000;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
int n,m,k,a[200005],b[200005];
bool bo;
int main(){
init();
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int opt,l,r,ans=0,lo,ll,lr;
while(m--){
scanf("%d%d%d",&opt,&l,&r);
if(bo){
if(id[opt^1])ans=opt^1;
else ans=opt^2;
printf("%d
",ans);
bo=0;
}
opt^=ans; l^=ans; r^=ans;
if(opt==1){bo=1;lo=opt;ll=l;lr=r;}
if(opt==2){a[l]=r;}
}
if(bo){
int len=lr-ll+1,num=0;
for(int i=1;i<=len;i++)b[i]=a[ll+i-1];
sort(b+1,b+len+1);
for(int i=1;i<=len;i++){
if(id[b[i]])num++;
if(num==k){ans=b[i];break;}
}
printf("%d
",ans);
}
return 0;
}
还要多学啊!!!