Pagini recente » Cod sursa (job #3285937) | Cod sursa (job #914273) | Cod sursa (job #2440204) | Cod sursa (job #1905557) | Cod sursa (job #3282118)
#include <iostream>
#include <fstream>
#include <cmath>
#define ll long long
using namespace std;
ifstream f ("aib.in");
ofstream g ("aib.out");
const ll NMAX = 100000,
SQMAX = 1000;
ll N, M, nrB, BLOCK_SIZE, V[NMAX+1], SB[NMAX+1];
void citire() {
f >> N >> M;
for (ll i=0; i<N; i++)
f >> V[i];
}
void construire() {
nrB = -1;
//
BLOCK_SIZE = (ll) sqrt(N);
//
for (ll i=0; i<N; i++) {
if (i % BLOCK_SIZE == 0)
nrB++;
SB[nrB] += V[i];
}
}
void update(ll poz, ll val) {
ll blockNumber = poz / BLOCK_SIZE;
SB[blockNumber] += val;
V[poz] += val;
}
ll querry1(ll st, ll dr) {
ll sum = 0;
//
while(st <= dr && st % BLOCK_SIZE != 0)
sum += V[st++];
//
while(st + BLOCK_SIZE - 1 <= dr) {
sum += SB[st/BLOCK_SIZE];
st += BLOCK_SIZE;
}
//
while(st <= dr)
sum += V[st++];
//
return sum;
}
ll querry2(ll targetSum) {
ll sum = 0, blockNumber = 0, poz;
//
while (sum + SB[blockNumber] <= targetSum && blockNumber <= nrB)
sum += SB[blockNumber++];
//
poz = blockNumber * BLOCK_SIZE;
//
while (sum + V[poz] <= targetSum && poz < N)
sum += V[poz++];
//
if (sum != targetSum)
return -1;
return poz;
}
int main()
{
citire();
construire();
ll op, a, b;
for (int i=1; i<=M; i++) {
f >> op;
switch(op) {
case 0:
f >> a >> b;
update(a-1, b);
break;
case 1:
f >> a >> b;
g << querry1(a-1, b-1) << '\n';
break;
case 2:
f >> a;
g << querry2(a) << '\n';
break;
}
}
f.close();
g.close();
return 0;
}