如题。此题应该要开long long 。可是如果我写了 long long sum
就全部错误。不开时91分,没有错误。
#include <bits/stdc++.h>
#define N 50005
using namespace std;
int n,m,tot,len;
struct seg{
int lazy,lson,rson;
int sum;//写成long long就错
}seg[20000005];
int SEG[N<<2];
int init(){
int rt=++tot;
seg[rt].sum=seg[rt].lazy=0;
seg[rt].lson=seg[rt].rson=-1;
return rt;
}
void pushdown(int rt,int ln,int rn){
if(seg[rt].lazy){
if(seg[rt].lson!=-1){
int l=seg[rt].lson;
seg[l].lazy+=seg[rt].lazy; seg[l].sum+=(long long)seg[rt].lazy*ln;
}
else{
seg[rt].lson=init();
int l=seg[rt].lson;
seg[l].lazy+=seg[rt].lazy; seg[l].sum+=(long long)seg[rt].lazy*ln;
}
if(seg[rt].rson!=-1){
int r=seg[rt].rson;
seg[r].lazy+=seg[rt].lazy; seg[r].sum+=(long long)seg[rt].lazy*rn;
}
else{
seg[rt].rson=init();
int r=seg[rt].rson;
seg[r].lazy+=seg[rt].lazy; seg[r].sum+=(long long)seg[rt].lazy*rn;
}
seg[rt].lazy=0;
}
}
void update(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
seg[rt].lazy+=1;
seg[rt].sum+=r-l+1;
return;
}
int mid=(l+r)>>1;
pushdown(rt,mid-l+1,r-mid);
if(L<=mid){
if(seg[rt].lson==-1) seg[rt].lson=init();
update(L,R,l,mid,seg[rt].lson);
}
if(mid+1<=R){
if(seg[rt].rson==-1) seg[rt].rson=init();
update(L,R,mid+1,r,seg[rt].rson);
}
seg[rt].sum=0;
if(seg[rt].lson!=-1) seg[rt].sum+=seg[seg[rt].lson].sum;
if(seg[rt].rson!=-1) seg[rt].sum+=seg[seg[rt].rson].sum;
}
void UPDATE(int L,int R,int p,int l,int r,int rt){
if(SEG[rt]==-1) SEG[rt]=init();
update(L,R,1,n,SEG[rt]);
int mid=(l+r)>>1;
if(l==r) return;
if(p<=mid) UPDATE(L,R,p,l,mid,rt<<1);
if(p>mid) UPDATE(L,R,p,mid+1,r,rt<<1|1);
}
long long query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R) return seg[rt].sum;
int mid=(l+r)>>1;
long long ans=0;
pushdown(rt,mid-l+1,r-mid);
if(L<=mid) ans+=query(L,R,l,mid,seg[rt].lson);
if(mid+1<=R) ans+=query(L,R,mid+1,r,seg[rt].rson);
return ans;
}
int QUERY(int L,int R,long long K,int l,int r,int rt){
if(l==r) return l;
int mid=(l+r)>>1;
long long num=query(L,R,1,n,SEG[rt<<1|1]);
if(num>=K) return QUERY(L,R,K,mid+1,r,rt<<1|1);
else return QUERY(L,R,K-num,l,mid,rt<<1);
}
int OP[N],L[N],R[N];
long long C[N],D[N];
signed main(){
int op,l,r;
long long c;
while(cin>>n>>m){
memset(SEG,-1,sizeof(SEG)); tot=0; len=0;
for(int i=1;i<=m;i++){
cin>>OP[i]>>L[i]>>R[i]>>C[i];
if(OP[i]==1) D[++len]=C[i];
}
sort(D+1,D+len+1); len=unique(D+1,D+len+1)-D-1;
for(int i=1;i<=m;i++){
op=OP[i]; l=L[i]; r=R[i];
if(op==1) c=lower_bound(D+1,D+len+1,C[i])-D,UPDATE(l,r,c,1,n,1);
if(op==2) c=C[i],cout<<D[QUERY(l,r,c,1,n,1)]<<endl;
}
}
return 0;
}