描述
假设起始时所有人的军功都是0.
输入
只有一组测试数据。
每一行是两个整数T和M表示共有T条指令,M个士兵。(1<=T,M<=1000000)
随后的T行,每行是一个指令。
指令分为两种:
一种形如
ADD 100 500 55表示,第100个人到第500个人请战,最终每人平均获得了55军功,每次每人获得的军功数不会超过100,不会低于-100。
第二种形如:
QUERY 300 表示南将军在询问第300个人的军功是多少。
输出
对于每次查询输出此人的军功,每个查询的输出占一行。
样例输入
4 10
ADD 1 3 10
QUERY 3
ADD 2 6 50
QUERY 3
样例输出
10
60
代码:
#include<stdio.h> #include<string.h> int C[1000008]; int M; int lowbit(int n){ return n&-n; } void add(int n,int x) { while(n>0){ C[n]+=x; n-=lowbit(n); } } int query(int n){ int sum=0; while(n<=M){ sum+=C[n]; //printf("%d\n",n); n+=lowbit(n); } return sum; } int main() { int T; scanf("%d%d",&T,&M); char str[10]; while(T--){ inta,b,x; scanf("%s",str); if(!strcmp("ADD",str)){ scanf("%d%d%d",&a,&b,&x); add(a-1,-x);//去掉重复的 add(b,x); }else{ scanf("%d",&x); printf("%d\n",query(x)); } for(inti=0;i<=M;i++){ printf("%d&&%d\n",i,C[i]); } } }