为什么爆0了QWQ
查看原帖
为什么爆0了QWQ
334391
章鱼小丸子楼主2020/6/2 18:53

QWQ

#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 18:53
加载中...