Pagini recente » Cod sursa (job #132361) | Cod sursa (job #2793115) | Cod sursa (job #369933) | Cod sursa (job #2600955) | Cod sursa (job #371488)
Cod sursa(job #371488)
#include <fstream>
#include <cmath>
int main ()
{
std::ifstream f_in("datorii.in");
std::ofstream f_out("datorii.out");
unsigned int N, M, vect[15000], buckets[123], i;
f_in >> N >> M;
memset(buckets, 0, sizeof(buckets));
unsigned int bucketsize = static_cast<unsigned int>(std::sqrt(N));
for (i=0; i<N; ++i) { f_in >> vect[i]; buckets[i/bucketsize] += vect[i]; }
for (i=0; i<M; ++i) {
unsigned int op, a, b;
f_in >> op >> a >> b;
switch (op) {
case 0:
--a;
vect[a] -= b;
buckets[a/bucketsize] -= b;
break;
case 1:
--a; --b;
unsigned int startbucket = a/bucketsize, endbucket = b/bucketsize;
bool before=false, after=false, in = true;
unsigned int sum=0;
if (a%bucketsize != 0) { before = true; ++startbucket; }
if (b%bucketsize != bucketsize-1) {
after = true;
if (endbucket > 0) --endbucket;
else in = false;
}
unsigned int j,k;
if (before) {
k = startbucket * bucketsize;
for (j=a; j<k; ++j) sum += vect[j];
}
if (in) for (j=startbucket; j<=endbucket; ++j) sum += buckets[j];
if (after) {
for (j=endbucket*bucketsize+1; j<=b; ++j) sum += vect[j];
}
f_out << sum << '\n';
break;
}
}
f_in.close();
f_out.close();
return 0;
}