Cod sursa(job #856655)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 16 ianuarie 2013 20:30:01
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#include <math.h>
 
using namespace std;
 
const char infile[] = "datorii.in";
const char outfile[] = "datorii.out";
const int MAXN = 15002;
 
int N, M, R;
int v[MAXN];
int *buckets;
 
int query(int a, int b) {
    int bucket1 = a / R, bucket2 = b / R, sum = 0, i;
    if(bucket1 == bucket2)
        for(i = a; i <= b; ++i)
            sum += v[i];
    else {
        for(i = a; i < R * (bucket1 + 1); ++i)
            sum += v[i];
        for(i = bucket1 + 1; i < bucket2; ++i)
            sum += buckets[i];
        for(i = bucket2 * R; i <= b; ++i)
            sum += v[i];
    }
    return sum;
}
 
void pay(int day, int val) {
    int bucket = day / R;
    v[day] -= val;
    buckets[bucket] -= val;
}
 
int main() {
    ifstream fin(infile);
    ofstream fout(outfile);
 
    fin >> N >> M;
    R = (int)sqrt(N);
    buckets = new int[R + 2];
 
    int i, op, a, b;
    for(i = 0; i < N; ++i) {
        fin >> v[i];
        buckets[i / R] += v[i];
    }
 
    for(i = 0; i < M; ++i) {
        fin >> op >> a >> b;
        if(op)
            fout << query(a - 1, b - 1) << "\n";
        else
            pay(a - 1, b);
    }
    fin.close();
    fout.close();
    return 0;
}