Pagini recente » Cod sursa (job #2665117) | Cod sursa (job #1317467) | Cod sursa (job #281051) | Cod sursa (job #3176765) | Cod sursa (job #3252317)
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int n, q, v[15005], bc[200], rad, nrb;
int st_bucket(int b)
{
return (b - 1) * rad + 1;
}
int dr_bucket(int b)
{
return min(n, b * rad);
}
int find_bucket(int poz)
{
if(poz % rad == 0)
return poz / rad;
return poz / rad + 1;
}
int main()
{
f >> n >> q;
rad = sqrt(n);
nrb = 1;
for(int i = 1; i <= n; i ++)
{
f >> v[i];
if(i <= dr_bucket(nrb))
bc[nrb] += v[i];
if(i == dr_bucket(nrb)) nrb ++;
}
for(int i = 1; i <= q; i ++)
{
int op, x, y;
f >> op >> x >> y;
if(op == 0)
{
int b = find_bucket(x);
y = min(y, v[x]);
bc[b] -= y; v[x] -= y;
}
else
{
int b1 = find_bucket(x), b2 = find_bucket(y), sumi = 0;
if(b1 == b2)
{
for(int j = x; j <= y; j ++)
sumi += v[j];
g << sumi << '\n';
continue;
}
if(x != st_bucket(b1))
for(int j = x; j <= dr_bucket(b1); j ++)
sumi += v[j];
else
b1 --;
if(y != dr_bucket(b2))
for(int j = st_bucket(b2); j <= y; j ++)
sumi += v[j];
else
b2 ++;
for(int j = b1 + 1; j < b2; j ++)
sumi += bc[j];
g << sumi << '\n';
}
}
return 0;
}