Mathematicians are interesting (sometimes, I would say, even crazy) people. For example, my friend, a mathematician, thinks that it is very fun to play with a sequence of integer numbers. He writes the sequence in a row. If he wants he increases one number of the sequence, sometimes it is more interesting to decrease it (do you know why?..) And he likes to add the numbers in the interval [l;r]. But showing that he is really cool he adds only numbers which are equal some mod (modulo m).
Guess what he asked me, when he knew that I am a programmer? Yep, indeed, he asked me to write a program which could process these queries (n is the length of the sequence):
- + p r It increases the number with index p by r. (
,
)
You have to output the number after the increase.
- - p r It decreases the number with index p by r. (
,
) You must not decrease the number if it would become negative.
You have to output the number after the decrease.
- s l r mod You have to output the sum of numbers in the interval
which are equal mod (modulo m). (
) (
)
The first line of each test case contains the number of elements of the sequence n and the number m. (1 ≤ n ≤ 10000) (1 ≤ m ≤ 10)
The second line contains n initial numbers of the sequence. (0 ≤ number ≤ 1000000000)
The third line of each test case contains the number of queries q (1 ≤ q ≤ 10000).
The following q lines contains the queries (one query per line).
Output q lines - the answers to the queries.
3 4
1 2 3
3
s 1 3 2
+ 2 1
- 1 2
2
3
1
看一下資料範圍,
m<=20
果斷開20個樹狀陣列
注意:要開long long
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<cstring> 6 #include<algorithm> 7 #define lli long long int 8 using namespace std; 9 const lli MAXN=10001; 10 void read(lli &n) 11 { 12 char c='+';lli x=0;bool flag=0; 13 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;} 14 while(c>='0'&&c<='9')x=x*10+c-48,c=getchar(); 15 n=flag==1?-x:x; 16 } 17 lli n,m; 18 struct node 19 { 20 lli a[MAXN]; 21 lli lowbit(lli x){return x&(-x);} 22 lli change(lli pos,lli val) 23 { 24 for(;pos<=n;pos+=lowbit(pos)) 25 a[pos]+=val; 26 } 27 lli query(lli l,lli r) 28 { 29 return ask(r)-ask(l-1); 30 } 31 lli ask(lli pos) 32 { 33 lli ans=0; 34 for(;pos;pos-=lowbit(pos)) 35 ans+=a[pos]; 36 return ans; 37 } 38 node(){memset(a,0,sizeof(a));} 39 }bit[21]; 40 lli date[MAXN]; 41 int main() 42 { 43 read(n);read(m); 44 for(lli i=1;i<=n;i++) 45 { 46 read(date[i]); 47 bit[date[i]%m].change(i,date[i]); 48 } 49 lli T;read(T); 50 while(T--) 51 { 52 char how;cin>>how; 53 if(how=='+') 54 { 55 lli p,num;read(p);read(num); 56 bit[date[p]%m].change(p,-date[p]); 57 date[p]+=num; 58 bit[date[p]%m].change(p,date[p]); 59 printf("%lld\n",date[p]); 60 } 61 else if(how=='-') 62 { 63 lli p,num;read(p);read(num); 64 if(date[p]<num) 65 printf("%lld\n",date[p]); 66 else 67 { 68 bit[date[p]%m].change(p,-date[p]); 69 date[p]-=num; 70 bit[date[p]%m].change(p,date[p]); 71 printf("%lld\n",date[p]); 72 } 73 74 } 75 else if(how=='s') 76 { 77 lli l,r,mod;read(l);read(r);read(mod); 78 printf("%lld\n",bit[mod].query(l,r)); 79 } 80 } 81 return 0; 82 }