SCOI2016 美味
作者:互联网
题目链接:戳我
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 200010
using namespace std;
int n,m,tot,ans;
int a[MAXN+10],rt[MAXN+10];
struct Node{int ls,rs,sum;}t[MAXN*32];
inline void update(int &x,int f,int l,int r,int k)
{
x=++tot;
t[x]=t[f];t[x].sum++;
if(l==r) return;
int mid=(l+r)>>1;
if(k<=mid) update(t[x].ls,t[f].ls,l,mid,k);
else update(t[x].rs,t[f].rs,mid+1,r,k);
}
inline int query(int x,int f,int l,int r,int ll,int rr)
{
int cur=t[x].sum-t[f].sum,cur_ans=0;
if(ll<=l&&r<=rr) return cur;
int mid=(l+r)>>1;
if(ll<=mid) cur_ans+=query(t[x].ls,t[f].ls,l,mid,ll,rr);
if(mid<rr) cur_ans+=query(t[x].rs,t[f].rs,mid+1,r,ll,rr);
return cur_ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
update(rt[i],rt[i-1],1,MAXN,a[i]);
}
// for(int i=1;i<=n;i++) printf("a[%d]=%d\n",i,a[i]); puts("");
// for(int i=1;i<=n;i++) printf("rt[%d]=%d\n",i,rt[i]);
for(int i=1;i<=m;i++)
{
int b,x,l,r,k,ll,rr,ans=0;
scanf("%d%d%d%d",&b,&x,&l,&r);
for(int j=17;j>=0;j--)
{
if(b&(1<<j))
{
ll=ans,rr=ans+(1<<j)-1;
k=0;
}
else
{
ll=ans+(1<<j),rr=ans+(1<<(j+1))-1;
k=1;
}
if(!query(rt[r],rt[l-1],1,MAXN,max(1,ll-x),min(MAXN,rr-x))) k^=1;
ans|=(k<<j);
}
printf("%d\n",ans^b);
}
return 0;
}
标签:10,include,int,sum,tot,MAXN,SCOI2016,美味 来源: https://www.cnblogs.com/fengxunling/p/10806043.html