我最后多写了一个求和函数来检验答案,因为找不出bug,就只能采取这样离谱的措施......
求大佬指出错误QAQ
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<set>
#include<vector>
#define ll long long
#define ld double
#define FOR(inum,st,ed) for(ll (inum)=(st),upnum=(ed);(inum)<=upnum;(inum)++)
#define ROF(inum,st,ed) for(ll (inum)=(st),donum=(ed);(inum)>=donum;(inum)--)
#define FORK(inum,st,ed,knum) for(ll (inum)=(st),upnum=(ed);(inum)<=upnum;(inum)+=knum)
#define FORE(x) for(ll ei=head[x],to=e[ei].to;ei;ei=e[ei].next,to=e[ei].to)
#define il inline
#define lowbit(x) (x&-x)
using namespace std;
inline ll read(){
char c=getchar();ll ans=0,f=0;
for(;c<'0'||c>'9';c=getchar()) f|=(c=='-');
for(;c>='0'&&c<='9';c=getchar()) (ans*=10)+=c-'0';
return f?-ans:ans;
}
inline void chkmax(ll &x,ll y){x=x>y?x:y;}
inline void chkmin(ll &x,ll y){x=x<y?x:y;}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
const ll maxn=2e6+50,mod=998244353,inf=1e15;
ll n,m,arr[maxn];
bool flag;
struct segment_tree{
ll l,r,sum,mn;
#define l(w) tree[w].l
#define r(w) tree[w].r
#define sum(w) tree[w].sum
#define mn(w) tree[w].mn
}tree[maxn<<2];
#define ls (p<<1)
#define rs (p<<1|1)
void pushup(ll p){
sum(p)=sum(ls)+sum(rs);
mn(p)=min(mn(ls),mn(rs));
}
void build(ll p,ll l,ll r){
l(p)=l;r(p)=r;
if(l==r){
mn(p)=(arr[l]==1?l:n+1);
sum(p)=arr[l];
return ;
}
ll mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p);
}
void updata(ll p,ll x,ll val){
if(l(p)==r(p)){
mn(p)=(val==1?x:inf);
sum(p)=val;
return ;
}
ll mid=l(p)+r(p)>>1;
if(x<=mid) updata(ls,x,val);
else updata(rs,x,val);
pushup(p);
}
ll query_sum(ll p,ll k){
while(l(p)<r(p)){
if(sum(ls)>=k) p=ls;
else k-=sum(ls),p=rs;
}
flag=(k==sum(p));
return l(p);
}
ll query_mn(ll p,ll l,ll r){
if(l>r) return inf;
if(l<=l(p)&&r(p)<=r) return mn(p);
ll mid=l(p)+r(p)>>1,ans=inf;
if(l<=mid) chkmin(ans,query_mn(ls,l,r));
if(mid<r) chkmin(ans,query_mn(rs,l,r));
return ans;
}
ll query(ll p,ll l,ll r){
if(l<=l(p)&&r(p)<=r) return sum(p);
ll mid=l(p)+r(p)>>1,sum=0;
if(l<=mid) sum+=query(ls,l,r);
if(mid<r) sum+=query(rs,l,r);
return sum;
}
char str[5];
int main(){
n=read();m=read();
FOR(i,1,n) arr[i]=read();
build(1,1,n);
for(ll s,x,y,ansl,ansr;m;m--){
scanf("%s",str);
if(str[0]=='A'){
flag=false;
s=read();
if(s>sum(1)||s==0){
puts("none");
continue;
}
x=query_sum(1,s);
if(flag){
printf("%lld %lld\n",1,x);
continue;
}
ll l=query_mn(1,1,x-1),r=query_mn(1,x,n);
if(l==inf&&r==inf){
puts("none");
continue;
}
if(l>=r-x+1)
ansl=r-x+1,ansr=r;
else
ansl=l+1,ansr=l+x-1;
if(query(1,ansl,ansr)==s)//就是这里,我采取的离谱措施......
printf("%lld %lld\n",ansl,ansr);
else puts("none");
}
else{
x=read(),y=read();
updata(1,x,y);
}
}
return 0;
}