我75分的代码tree数组开的 3e5∗40然后挂了;
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int tot;
const int maxn=3e5+1;
struct node {
int l,r,val;
} tree[maxn*40];
int root[maxn];
int New(int x) {
int rt=++tot;
tree[rt]=tree[x];
return rt;
}
#define mid (l+r>>1)
int update(int rt,int l,int r,int p,int val) {
rt=New(rt);
if(l==r) {
tree[rt].val+=val;
return rt;
}
if(mid>=p) {
tree[rt].l=update(tree[rt].l,l,mid,p,val);
} else {
tree[rt].r=update(tree[rt].r,mid+1,r,p,val);
}
return rt;
}
int query(int rt1,int rt2,int l,int r,int p) {
if(l==r) {
return tree[rt2].val-tree[rt1].val;
}
if(mid>=p) {
return query(tree[rt1].l,tree[rt2].l,l,mid,p);
} else {
return query(tree[rt1].r,tree[rt2].r,mid+1,r,p);
}
}
int num[maxn];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>num[i];
root[i]=update(root[i-1],1,3e5,num[i],1);
}
for(int i=1; i<=m; i++) {
int op;
cin>>op;
if(op==1) {
int l,r,c;
cin>>l>>r>>c;
cout<<query(root[l-1],root[r],1,3e5,c)<<'\n';
} else {
int x;
cin>>x;
if(num[x]==num[x+1]) continue;
root[x]=update(root[x],1,3e5,num[x],-1);
root[x]=update(root[x],1,3e5,num[x+1],1);
swap(num[x],num[x+1]);
}
}
return 0;
}
改成3e5*60就过了,什么原因。