Cod sursa(job #233005)

Utilizator Boicescu_TheodorBoicescu Theodor Boicescu_Theodor Data 16 decembrie 2008 18:34:24
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <cstdio>   
#include <iostream>   
#include <vector>   
#include <string>   
#include <algorithm>   
#include <set>   
#include <sstream>   
#include <numeric>   
#include <cmath>   
#include <queue>   
#include <stack>   
#include <map>   
#include <cassert>   
#include <ctime>   
#include <cstdlib>   
// #include <classic_algorithms>   
// #include <creativity>   
using namespace std;   
  
#define REP(i, n) for (int i = 0; i < (n); ++i)   
#define REPV(i, a, b) for (int i = (a); i <= (b); ++i)   
#define REPIT(it, v) for(it = v.begin(); it != v.end(); ++it)   
#define REPD(i, n) for (int i = (n) - 1; i >= 0; --i)   
#define REPVD(i, b, a) for (int i = (b); i >= (a); --i)   
  
#define SZ(a) ((int)a.size())   
#define PB push_back   
#define ALL(x) (x).begin(), (x).end()   
#define MP make_pair   
#define X first   
#define Y second   
  
#define CLR(t) memset((t), 0, sizeof(t))   
#define CPY(dest, source) memcpy((dest), (source), sizeof(source))   
#define MSET(t, v) memset((t), v, sizeof(t))   
  
typedef long long LL;    
typedef vector<int> VI;    
typedef istringstream ISS;   
typedef vector<string> VS;   
typedef pair<int, int> PII;   
template<class T> ostream& operator<<(ostream& os, const vector<T>& a) { int i = 0, n = a.size(); for(;i<n;++i) os<<a[i]<<','; os<<endl; return os; }   
  
const int MAXN = 1 << 14;   
int N;   
LL sum[MAXN];   
  
void add(int n, LL delta) {   
    while (n <= N) {   
        sum[n] += delta;   
        n = (n << 1) - (n & (n-1));   
    }   
}   
  
LL query(int pos) {   
    LL res = 0;   
    while (pos) {   
        res += sum[pos];   
        pos &= pos-1;   
    }   
    return res;   
}   
  
int main()   
{   
       freopen("datorii.in", "rt", stdin);   
       freopen("datorii.out", "wt", stdout);   
  
       int M;   
       scanf("%d %d", &N, &M);   
       REP(i, N) {   
           int a;   
           scanf("%d", &a);   
           add(i+1, a);   
       }   
  
       while (M--) {   
           int type, a, b;   
           scanf("%d %d %d", &type, &a, &b);   
           if (type) {   
               printf("%d\n", query(b) - query(a-1));   
           } else {   
               add(a, -b);   
           }   
       }   
  
       return 0;   
}