rt,50 分,后面 5 个点全 T 了。
下载数据,跑出来确实像死循环一样跑不出结果。但是想注释查看哪个函数写错了,结果发现只处理操作 1 或 2 就都没有问题,能跑出来。所以求助。
调试的时候是这样调的:
诶,还押上了?
总之怀疑是因为 delete 操作影响了 query 操作,然后区间范围传错导致死循环。
求大佬看看。
#include<bits/stdc++.h>
using namespace std;
long long n,m,ntot = 0;
long long num[2000005];
const long long inf = 0x3f3f3f3f;
struct node{
long long ls,rs,del,Max,Min;
}tree[1000500<<2];
void push_up(long long p){
tree[p].Max = max(tree[tree[p].ls].Max,tree[tree[p].rs].Max);
tree[p].Min = min(tree[tree[p].ls].Min,tree[tree[p].rs].Min);
tree[p].del = tree[tree[p].ls].del+tree[tree[p].rs].del;
return;
}
long long build(long long pl,long long pr){
long long p = ++ntot;
tree[p].del = 0;
if(pl == pr){
tree[p].Max = tree[p].Min = num[pl];
return p;
}
long long mid = pl+((pr-pl)>>1);
tree[p].ls = build(pl,mid);
tree[p].rs = build(mid+1,pr);
push_up(p);
return p;
}
void modify(long long p,long long pl,long long pr,long long opt){
if(pl == pr){
tree[p].Max = -inf,tree[p].Min = inf;
tree[p].del = 1;
return;
}
long long mid = pl+((pr-pl)>>1);
if(opt <= (mid-pl+1-tree[tree[p].ls].del)){
modify(tree[p].ls,pl,mid,opt);
}else{
modify(tree[p].rs,mid+1,pr,opt-(mid-pl+1-tree[tree[p].ls].del));
}
push_up(p);
return;
}
pair<long long,long long> query(long long p,long long pl,long long pr,long long l,long long r){
if(l == 1 && r == pr-pl+1){
return {tree[p].Max,tree[p].Min};
}
long long mid = pl+((pr-pl)>>1);
long long Size = (mid-pl+1-tree[tree[p].ls].del);
pair<long long,long long> res,tp;
res = {-inf,inf};
if(l <= Size){
tp = query(tree[p].ls,pl,mid,l,min(r,Size));
res.first = max(res.first,tp.first);
res.second = min(res.second,tp.second);
}
if(Size < r){
tp = query(tree[p].rs,mid+1,pr,max(1ll,l-Size),r-Size);
res.first = max(res.first,tp.first);
res.second = min(res.second,tp.second);
}
return res;
}
int main(){
// freopen("P6011_6.in","r",stdin);
// freopen("P6011_6.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(long long i = 1; i <= n; i++){
scanf("%lld",&num[i]);
}
build(1,n);
while(m--){
static long long tpa,tpb,tpc;
static pair<long long,long long> tpd;
scanf("%lld%lld",&tpa,&tpb);
if(tpa>>1){
scanf("%lld",&tpc);
tpd = query(1,1,n,tpb,tpc);
printf("%lld %lld\n",tpd.second,tpd.first);
continue;
}
modify(1,1,n,tpb);
}
return 0;
}