Mai intai trebuie sa te autentifici.
Cod sursa(job #2581337)
Utilizator | Data | 14 martie 2020 22:09:45 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 20 |
Compilator | cpp-64 | Status | done |
Runda | hard123 | Marime | 1.69 kb |
#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(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];
for(int i = 1; i <= n; i++)
for(int j = i - (-i & i) + 1; j <= i; j++)
aib[i] += v[j];
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;
}