记录编号 372037 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2013] K大数查询 最终得分 100
用户昵称 Gravatar哒哒哒哒哒! 是否通过 通过
代码语言 C++ 运行时间 5.367 s
提交时间 2017-02-17 16:21:21 内存使用 477.20 MiB
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
#define ll long long 
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
	return x*f;
}
const int maxn=50005*2;
int n,m,N,cnt,root[maxn*250],lazy[maxn*250];
int sum[maxn*250],lc[maxn*250],rc[maxn*250];
void insert(int &rt,int l,int r,int a,int b){
	if(!rt) rt=++cnt;
	if(a<=l&&b>=r){sum[rt]+=(r-l+1);lazy[rt]++;return;}
	int mid=(l+r)/2;
	if(a<=mid) insert(lc[rt],l,mid,a,b);
	if(b>mid) insert(rc[rt],mid+1,r,a,b);
	sum[rt]=sum[lc[rt]]+sum[rc[rt]]+(r-l+1)*lazy[rt];
}
void insert(int rt,int l,int r,int p,int a,int b){
	insert(root[rt],1,N,a,b);
	if(l==r) return;int mid=(l+r)/2;
	if(p<=mid) insert(rt*2,l,mid,p,a,b);
	else insert(rt*2+1,mid+1,r,p,a,b);
}
int query(int rt,int l,int r,int a,int b){
	if(a<=l&&b>=r) return sum[rt];
	int mid=(l+r)/2,res=0;
	if(lazy[rt])
		res+=(min(r,b)-max(l,a)+1)*lazy[rt];
	if(a<=mid) res+=query(lc[rt],l,mid,a,b);
	if(b>mid) res+=query(rc[rt],mid+1,r,a,b);
	return res;
}
int query(int rt,int l,int r,int a,int b,int k){
	if(l==r) return l;
	int mid=(l+r)/2,c=query(root[rt*2+1],1,N,a,b);
	if(c>=k) return query(rt*2+1,mid+1,r,a,b,k);
	else return query(rt*2,l,mid,a,b,k-c);
}
int main(){
	freopen("zjoi13_sequence.in","r",stdin);freopen("zjoi13_sequence.out","w",stdout);
	n=read(),m=read(),N=2*n+1;
	while(m--){
		int op=read(),a=read(),b=read(),c=read();
		if(op==1) insert(1,1,N,c+n+1,a,b);
		else printf("%d\n",query(1,1,N,a,b,c)-n-1);
	}
	fclose(stdin);fclose(stdout);
	return 0;
}