题目描述
给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区间的和。时间限制1秒。
输入格式
第一行1个数,表示序列的长度n
第二行1个数,表示操作的次数w
后面依次是w行,分别表示加入和询问操作
其中,加入用x表示,询问用y表示
x的格式为"x a b" 表示在序列a的位置加上b
y的格式为"y a b" 表示询问a到b区间的加和
输出格式
每行一个数,分别是每次询问的结果
输入输出样例
输入 #1
5 4 x 3 8 y 1 3 x 4 9 y 3 4
输出 #1
8 17
看见很多人那树状数组做,但我模拟为什么过了?
由此可得:
模 拟 大 法 好 ! ! !
#include<cstdio> #include<iostream> using namespace std; int n,i,j,m; long long int a[100005]; int main(){ scanf("%d",&n); scanf("%d",&m); while(m--){ char z; int b,c; long long ans=0; cin>>z; scanf("%d%d",&b,&c); if(z=='x'){ a[b]+=c; } else{ for(i=b;i<=c;i++){ ans+=a[i]; } printf("%lld ",ans); } } return 0; }