fork download
  1. #include <bits/stdc++.h>
  2. #define FIN "aib.in"
  3. #define FOUT "aib.out"
  4.  
  5. using namespace std;
  6.  
  7. int N, M, fen[ 100005 ];
  8.  
  9. void update(int x, int val) {
  10.  
  11. for( ;x<=N; x+=x^(x-1)&x) {
  12.  
  13. fen[x] += val;
  14. }
  15. }
  16.  
  17. int query(int x) {
  18.  
  19. int ans;
  20.  
  21. for(ans = 0; x; x-=x^(x-1)&x) {
  22.  
  23. ans += fen[x];
  24. }
  25. return ans;
  26. }
  27.  
  28. int search(int x) {
  29.  
  30. int log, index;
  31.  
  32. for(log = 1; log < N; log <<= 1);
  33.  
  34. for(index = 0; log; log>>=1) {
  35.  
  36. if(index+log<=N && fen[index+log]<=x)
  37.  
  38. index += log, x-=fen[index];
  39. }
  40.  
  41. return (!x ? index : -1);
  42. }
  43.  
  44. int main(void)
  45. {
  46. int i, v, tip, a, b;
  47.  
  48. //freopen(FIN, "r", stdin);
  49. //freopen(FOUT, "w", stdout);
  50.  
  51. scanf("%d %d", &N, &M);
  52.  
  53. for(int i = 1; i <= N; ++i) {
  54. cin>>v;
  55. update(i,v);
  56. }
  57.  
  58. for( ; M; M--) {
  59.  
  60. cin>>tip;
  61.  
  62. if(tip == 0) {
  63.  
  64. cin>>a>>b;
  65. update(a,b);
  66.  
  67. } else if(tip == 1) {
  68.  
  69. cin>>a>>b;
  70.  
  71. cout<<query(b)-query(a-1)<<endl;
  72.  
  73. } else if(tip == 2) {
  74.  
  75. cin>>a;
  76.  
  77. printf("%d\n", (!a ? -1 : search(a)));
  78. }
  79. }
  80. }
Success #stdin #stdout 0.01s 5476KB
stdin
8 6
25 42 8 15 1 55 16 67
0 5 12
2 25
2 90
1 7 7
1 2 8
2 241
stdout
1
4
16
216
8