求助帖
查看原帖
求助帖
149478
Tyrion_Lannister楼主2020/5/8 16:23

QAQ

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100005
#define mid (l+r>>1)
int n,m,len,last=1,tot;

int s[N],e[N],p[N];
int num[N<<4],sum[N<<4];
int ch[N<<4][2],root[N];
struct node{
	int pos,val;
}q[N];
bool operator<(node a,node b){
	return a.pos<b.pos;
}
int b[N];
void insert(int &x,int pre,int l,int r,int pos,int k){
	if(!x) x=++tot;
	sum[x]=sum[pre]+k*b[pos];
	num[x]=num[pre]+k;
	printf("insert %d %d %d %d\n",l,r,num[x],sum[x]);	
	if(l==r) return;
	if(pos<=mid) ch[x][1]=ch[pre][1],insert(ch[x][0],ch[pre][0],l,mid,pos,k);
	else ch[x][0]=ch[pre][0],insert(ch[x][1],ch[pre][1],mid+1,r,pos,k);
}
int query(int x,int l,int r,int k){
	int d=num[ch[x][0]];
	printf("query %d %d %d %d %d %d\n",l,r,num[x],sum[x],d,k);
	if(l==r) {
		return k*b[l];
//		if(k>=num[x]) return sum[x];
//		return 0;
	}
	if(k<=d) return query(ch[x][0],l,mid,k);
	else return query(ch[x][1],mid+1,r,k-d)+sum[ch[x][0]];
}
void print(int x,int l,int r){
	printf("%d %d %d num %d sum %d\n",x,l,r,num[x],sum[x]);
	if(l==r) return;
	print(ch[x][0],l,mid);
	print(ch[x][1],mid+1,r);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",s+i,e+i,p+i);
		b[i]=p[i];
	}
	sort(b+1,b+n+1);
	len=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++){
		q[i]=(node){s[i],lower_bound(b+1,b+len+1,p[i])-b};
		q[i+n]=(node){e[i]+1,-(lower_bound(b+1,b+len+1,p[i])-b)};
	}
	sort(q+1,q+2*n+1);
	for(int i=1;i<=2*n;i++){
		printf("add %d %d\n",q[i].pos,b[q[i].val]);
		if(q[i].val<0){
			if(q[i-1].pos==q[i].pos)insert(root[q[i].pos],root[q[i].pos],1,len,-q[i].val,-1);
			else insert(root[q[i].pos],root[q[i].pos-1],1,len,-q[i].val,-1);
		}
		else{
			if(q[i-1].pos==q[i].pos) insert(root[q[i].pos],root[q[i].pos],1,len,q[i].val,1);
			else insert(root[q[i].pos],root[q[i].pos-1],1,len,q[i].val,1);
		}
		print(root[q[i].pos],1,len);
		puts("");
//		printf("%d %d %d\n",q[i].pos,q[i].val,q[i].val<0?-1:1);
	}
	for(int i=1;i<=m;i++){
		print(root[i],1,len);
		puts("");
	}
//	for(int i=1;i<=2*n;i++)
//		if(!root[i]) root[i]=root[i-1];
		
	for(int i=1;i<=m;i++){
		int x,a,b,c;
		scanf("%d%d%d%d",&x,&a,&b,&c);
		int k=1+(a*last+b)%c;
		printf("%d\n",query(root[x],1,len,k));
	}
}
2020/5/8 16:23
加载中...