原来忘update了;
但把update(1,x)加上也不行;
by xuanyuan_Niubi @ 2021-02-03 21:50:03
又发现一个问题,build应该是build(l,mid,k<<1)
但是改了还是不行
by xuanyuan_Niubi @ 2021-02-04 15:26:10
又发现一个问题,query递归的时候l,r不变
但是交一发还是0分,
虽然会TLE但是为什么不会A几个点呢。
by xuanyuan_Niubi @ 2021-02-04 15:44:14
最后是这个样子。
算了A不了就算了,至少样例过了。
```cpp
#include<cstdio>
using namespace std;
const int M=1000005;
struct tree{
int l,r,v;
}t[M<<2];
struct question{
int l,r;
}qu[M];
int n,m,q,last,a[M];
bool vis[M];
inline int read(){
char c=getchar();int x=0;
for(;c<'0'||c>'9';c=getchar());
for(;c<='9'&&c>='0';c=getchar())x=(x<<1)+(x<<3)+(c^48);
return x;
}
inline void push_up(int k){
t[k].v=t[k<<1].v+t[k<<1|1].v;
}
inline void build(int l,int r,int k){
t[k].l=l;
t[k].r=r;
if(l==r){
t[k].v=a[l];
return ;
}
int mid=l+r>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
push_up(k);
}
inline void update(int k,int x){
if(t[k].r<x||t[k].l>x)return ;
if(t[k].l==t[k].r){
if(t[k].l==x&&t[k].v>0){
t[k].v--;
}
return ;
}
int mid=t[k].l+t[k].r>>1;
if(x<=mid)update(k<<1,x);
else update(k<<1|1,x);
push_up(k);
}
inline void print(int k){
printf("(%d %d %d)\n",t[k].l,t[k].r,t[k].v);
if(t[k].l==t[k].r)return ;
print(k<<1);
print(k<<1|1);
}
inline bool query(int l,int r,int k){
// printf("(%d %d %d(%d %d))\n",l,r,k,t[k].l,t[k].r);
if(l<=t[k].l&&t[k].r<=r){
return t[k].v;
}
int mid=t[k].l+t[k].r>>1;
bool fl=false;
if(l<=mid)fl=query(l,r,k<<1);
if(r>mid)fl=query(l,r,k<<1|1);
return fl;
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
build(1,n,1);
for(int i=1;i<=m;i++){
qu[i].l=read();
qu[i].r=read();
}
q=read();
for(int i=1;i<=q;i++){
int x=read(),ans=0;
x=(x+last-1)%n+1;
update(1,x);
// print(1);
for(int j=1;j<=m;j++){
if(!vis[j]){
if(!query(qu[j].l,qu[j].r,1)){
ans++;
vis[j]=true;
}
// printf("---------------------\n");
}
else{
ans++;
}
}
last=ans;
printf("%d\n",ans);
}
return 0;
}
```
by xuanyuan_Niubi @ 2021-02-04 15:45:21