社区讨论
整体二分求助
P2617Dynamic Rankings参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo7vxph4
- 此快照首次捕获于
- 2023/10/27 08:38 2 年前
- 此快照最后确认于
- 2023/10/27 08:38 2 年前
CPP
#include<iostream>
#include<cstring>
#define mn 200010
#define inf 0x3f3f3f3f3f3f3f3f
#define ll long long
#define FOR(i,x,y) for(int i=x;i<=y;++i)
#define ROF(i,x,y) for(int i=x;i>=y;--i)
using namespace std;
int n,m,cnt,tmp;
struct Query
{
int op;
int x,y,k;
int id;
}q[mn<<1],lq[mn<<1],rq[mn<<1];
ll a[mn];
ll tr[mn];
ll ans[mn];
ll mina=inf,maxa;
inline ll query(ll x)
{
ll res=0;
for(;x;x-=x&-x)res+=tr[x];
return res;
}
inline void update(ll x,ll k)
{
for(;x<=n;x+=x&-x)tr[x]+=k;
}
inline void solve(ll lval,ll rval,int st,int ed)
{
if(st>ed)return;
if(lval==rval)
{
FOR(i,st,ed)if(q[i].op==1)ans[q[i].id]=lval;
return;
}
ll mid=lval+rval>>1;
ll lt=0,rt=0;
FOR(i,st,ed)
{
if(q[i].op==0)
{
if(q[i].y<=mid)
{
update(q[i].x,q[i].y);
lq[++lt]=q[i];
}
else rq[++rt]=q[i];
}
else
{
int t=query(q[i].y)-query(q[i].x-1);
if(t>=q[i].k)lq[++lt]=q[i];
else
{
q[i].k-=t;
rq[++rt]=q[i];
}
}
}
FOR(i,1,lt)
if(lq[i].op==0)
update(lq[i].x,-lq[i].y);
FOR(i,1,lt)q[st+i-1]=lq[i];
FOR(i,1,rt)q[st+lt+i-1]=rq[i];
solve(lval,mid,st,st+lt-1);
solve(mid+1,rval,st+lt,ed);
}
int main()
{
memset(ans,-1,sizeof(ans));
cin>>n>>m;
FOR(i,1,n)
{
cin>>a[i];
q[++cnt]={0,i,1,a[i]};
}
FOR(i,1,m)
{
char opt;
cin>>opt;
if(opt=='Q')
{
int l,r,k;
cin>>l>>r>>k;
q[++cnt]={1,l,r,k,i};
}
else
{
int x,y;
cin>>x>>y;
q[++cnt]={0,x,-1,a[x],0};
a[x]=y;
q[++cnt]={0,x,1,y,0};
}
}
solve(0,inf,1,cnt);
FOR(i,1,m)if(ans[i]!=-1)cout<<ans[i]<<endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...