题目描述
蒟蒻Edt把这个问题交给了你 ———— 一个精通数据结构的大犇,由于是第一题,这个题没那么难。。
edt 现在对于题目进行了如下的简化:
最开始的数组每个元素都是0
给出nn,optopt,modmod,minmin,maxmax,modmod在int范围内
操作AA,QQ
AA: LL,RR,XX 表示把[l,R][l,R]这个区间加上XX
(数组的从L到R的每个元素都加上X)
QQ: LL,RR 表示询问[L,R][L,R]这个区间中元素T满足 min<=(T*imin<=(T∗i%mod)<=maxmod)<=max 的 T这样的数的个数(i是数组下标)
(元素的值*数组下标%mod在min到max范围内)
由于 edt 请来了一位非三次元的仓鼠,他帮你用延后了部分问题,将这些询问打入了混乱时空,你的询问操作不会超过1000次,不幸的是,对于延后的询问操作可能有很多次(小于1e7次),但是保证这些延后的询问操作之后不会再次有修改操作
(就是在最后会有很多次询问,但不会进行修改)
输入输出格式
输入格式:
给出n,opt,mod,min,max表示序列大小,操作次数,取膜,最小值,最大值
下面opt行,给出
AA: LL,RR,XX表示区间加,保证X在int范围内(<2147483647)
QQ:LL,RR表示区间查询满足条件的个数
再给出一个FinalFinal值,表示后面有FinalFinal个询问
下面FinalFinal行,给出
LL,RR表示询问区间[L,R][L,R]表示询问[L,R][L,R]之间满足条件的个数
输出格式:
每行对于每个QQ操作输出QQ个数表示每次询问的值,
下面FinalFinal行表示FinalFinal个询问的值
用差分数组还是比较简单的
注意开longlong
//#include<bits/stdc++.h> #include<iostream> #include<cstring> #include<cstdio> #include<map> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define CLR(A,v) memset(A,v,sizeof A) #define inf 0x3f3f3f3f #define lson l,m,pos<<1 #define rson m+1,r,pos<<1|1 ////////////////////////////////////// const int N=3e6+5; ll differ[N],m,n,minn,maxx,mod,a,b,c,d[N],q,ans[N]; char s[2]; int main() { cin>>n>>m>>mod>>minn>>maxx; rep(i,1,m) { RS(s); if(s[0]=='A'){scanf("%lld%lld%lld",&a,&b,&c);differ[a]+=c;differ[b+1]-=c;} else { scanf("%lld%lld",&a,&b);int cnt=0; rep(i,1,b){d[i]=d[i-1]+differ[i];if(i>=a&&i<=b&& d[i]*i%mod>=minn&&d[i]*i%mod<=maxx)cnt++;} cout<<cnt<<endl; } } rep(i,1,n)d[i]=d[i-1]+differ[i]; rep(i,1,n) if(d[i]*i%mod>=minn&&d[i]*i%mod<=maxx)ans[i]=ans[i-1]+1; else ans[i]=ans[i-1]; RI(q); while(q--) { RII(a,b);cout<<ans[b]-ans[a-1]<<endl; } return 0; }