有大佬帮忙看看以下两段代码的区别吗
40pt 代码:
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N=1e6+19;
int tr[N<<5],ls[N<<5],rs[N<<5],root[N],tot,a[N];
void build(int &x,int l,int r){
x=++tot;
if(l==r)
return;
int mid=(l+r)/2;
build(ls[x],l,mid);
build(rs[x],mid+1,r);
}
void insert(int u,int &x,int l,int r,int k){
x=++tot;
tr[x]=tr[u]+1,ls[x]=ls[u],rs[x]=rs[u];
if(l==r)
return;
int mid=(l+r)/2;
if(k<=mid)
insert(ls[u],ls[x],l,mid,k);
else insert(rs[u],rs[x],mid+1,r,k);
}
int query(int u,int x,int l,int r,int k){
if(l==r)
return l;
int lx=tr[ls[x]]-tr[ls[u]];
int mid=(l+r)/2;
if(lx>=k)
return query(ls[u],ls[x],l,mid,k);
else return query(rs[u],rs[x],mid+1,r,k-lx);
}
signed main(){
int n,m;
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]);
build(root[0],1,N);
for(int i=1;i<=n;++i)
insert(root[i-1],root[i],1,N,a[i]);
for(int i=1;i<=m;++i){
int a,b,c;
scanf("%lld %lld %lld",&a,&b,&c);
printf("%lld\n",query(root[a-1],root[b],1,N,c));
}
return 0;
}
AC 代码:
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N=1e6+19;
int tr[N<<5],ls[N<<5],rs[N<<5],root[N],tot,a[N];
void build(int &x,int l,int r){
x=++tot;
if(l==r)
return;
int mid=(l+r)/2;
build(ls[x],l,mid);
build(rs[x],mid+1,r);
}
void insert(int u,int &x,int l,int r,int k){
x=++tot;
tr[x]=tr[u]+1,ls[x]=ls[u],rs[x]=rs[u];
if(l==r)
return;
int mid=(l+r)/2;
if(k<=mid)
insert(ls[u],ls[x],l,mid,k);
else insert(rs[u],rs[x],mid+1,r,k);
}
int query(int u,int x,int l,int r,int k){
if(l==r)
return l;
int lx=tr[ls[x]]-tr[ls[u]];
int mid=(l+r)/2;
if(lx>=k)
return query(ls[u],ls[x],l,mid,k);
else return query(rs[u],rs[x],mid+1,r,k-lx);
}
signed main(){
int n,m;
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]);
build(root[0],0,N);
for(int i=1;i<=n;++i)
insert(root[i-1],root[i],0,N,a[i]);
for(int i=1;i<=m;++i){
int a,b,c;
scanf("%lld %lld %lld",&a,&b,&c);
printf("%lld\n",query(root[a-1],root[b],0,N,c));
}
return 0;
}
区别:
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N=1e6+19;
int tr[N<<5],ls[N<<5],rs[N<<5],root[N],tot,a[N];
void build(int &x,int l,int r){
x=++tot;
if(l==r)
return;
int mid=(l+r)/2;
build(ls[x],l,mid);
build(rs[x],mid+1,r);
}
void insert(int u,int &x,int l,int r,int k){
x=++tot;
tr[x]=tr[u]+1,ls[x]=ls[u],rs[x]=rs[u];
if(l==r)
return;
int mid=(l+r)/2;
if(k<=mid)
insert(ls[u],ls[x],l,mid,k);
else insert(rs[u],rs[x],mid+1,r,k);
}
int query(int u,int x,int l,int r,int k){
if(l==r)
return l;
int lx=tr[ls[x]]-tr[ls[u]];
int mid=(l+r)/2;
if(lx>=k)
return query(ls[u],ls[x],l,mid,k);
else return query(rs[u],rs[x],mid+1,r,k-lx);
}
signed main(){
int n,m;
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]);
build(root[0],0,N);
//40pt build(root[0],1,N);
for(int i=1;i<=n;++i)
insert(root[i-1],root[i],0,N,a[i]);
//40pt insert(root[i-1],root[i],1,N,a[i]);
for(int i=1;i<=m;++i){
int a,b,c;
scanf("%lld %lld %lld",&a,&b,&c);
printf("%lld\n",query(root[a-1],root[b],0,N,c));
//40pt printf("%lld\n",query(root[a-1],root[b],1,N,c));
}
return 0;
}