为什么爆0了QWQ
查看原帖
为什么爆0了QWQ
334391
章鱼小丸子楼主2020/6/2 14:08
#include <iostream>
#include <vector>
#include <cstdio> 
using namespace std;
struct Tree{
	int l,r;
	long long sum,size;
}tree[int(1e7+10)];
const int maxn=301000;
int a[maxn],s[maxn],t[maxn],times[maxn];
vector<int>G[maxn];
int tot=0;
inline int build(int l,int r)
{
	tot++;
    int num=tot;
    int mid=(l+r)/2;
    if(l<r)
    {
        tree[num].l=build(l,mid);
        tree[num].r=build(mid+1,r);
    }
    return num;
}
inline int update(int pre,int l,int r,int k,int k2)
{
    int num=++tot;
    tree[num].l=tree[pre].l;
    tree[num].r=tree[pre].r;
    tree[num].size=tree[pre].size+k2;
    tree[num].sum=tree[pre].sum+k;
    int mid=(l+r)/2;
    if(l<r)
    {
    	if(max(k,-k)<=mid) 
		tree[num].l=update(tree[pre].l,l,mid,k,k2);
        else 
		tree[num].r=update(tree[pre].r,mid+1,r,k,k2);
    }   
    return num;
}
long long query(int x,int l,int r,int k)
{
    if(l==r) return (long long)l*k;
    int mid=(l+r)/2;
    if(tree[tree[x].l].size>=k)
        return query(tree[x].l,l,mid,k);
    else
        return tree[tree[x].l].sum+query(tree[x].r,mid+1,r,k-tree[tree[x].l].size);
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++)
	{
		scanf("%d%d%d",&s[i],&t[i],&a[i]);
		G[s[i]].push_back(a[i]);
		G[t[i]+1].push_back(-a[i]);
	}
	times[0]=build(1,n);
	for(int i=1; i<=n; i++)
	{
		times[i]=times[i-1];
		for(int j=0; j<G[i].size(); j++)
		{
			times[i]=update(times[i],1,n,G[i][j],G[i][j]>0?1:-1);
		}
	}
	long long last=1;
	for(int i=1; i<=m; i++)
	{
		long long x,a,b,c;
		scanf("%lld%lld%lld%lld",&x,&a,&b,&c);
		long long k=1+(a*last+b)%c;
		long long t=0;
		if(k>=tree[times[x]].size) t=tree[times[x]].sum;
		else t=query(times[x],1,n,k);
		printf("%lld\n",(last=t));
	}
	return 0;
}
2020/6/2 14:08
加载中...