Pagini recente » Cod sursa (job #783372) | Cod sursa (job #567265) | Cod sursa (job #763770) | Cod sursa (job #2680439) | Cod sursa (job #2581341)
#include <bits/stdc++.h>
#define MAX 100000
using namespace std;
int n;
int v[MAX], aib[MAX];
void update(int idx, int val)
{
while(idx <= n)
{
aib[idx] += val;
idx += (-idx & idx);
}
}
int sumaPoz(int idx)
{
int suma = 0;
while(idx)
{
suma += aib[idx];
idx -= (-idx & idx);
}
return suma;
}
int sumaInterval(int idx1, int idx2)
{
return sumaPoz(idx2) - sumaPoz(idx1 - 1);
}
int findVal(int val)
{
int p;
for(p = 1; (p << 1) <= n; p <<= 1);
int idCurrent = 0, sumaCurrent = 0;
for(; p && sumaCurrent != val; p >>= 1)
if(idCurrent + p <= n && sumaCurrent + aib[idCurrent + p] <= val)
{
sumaCurrent += aib[idCurrent + p];
idCurrent += p;
}
if(sumaCurrent != val)return -1;
return idCurrent;
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
ios::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
srand(time(NULL));
int m;
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
fin >> v[i];
v[i] += v[i - 1];
aib[i] = v[i] - v[i - (-i & i)];
}
for(int i = 1; i <= m; i++)
{
int c;
fin >> c;
if(c == 2)
{
int a;
fin >> a;
fout << findVal(a) << '\n';
}
else
{
int a, b;
fin >> a >> b;
if(c == 0)update(a, b);
else fout << sumaInterval(a, b) << '\n';
}
}
fin.close();
fout.close();
return 0;
}