Pagini recente » Cod sursa (job #396055) | Cod sursa (job #298292) | Cod sursa (job #680260) | Cod sursa (job #1375758) | Cod sursa (job #2123474)
#include <bits/stdc++.h>
#define NMax 100006
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
/**
aib[i] = suma elementelor din int. [i - 2 la k + 1, i], unde
k - nr. de biti de 0 de la sf. reprezentarii lui i in baza 2
i | Interval | Suma
---------------------
1 | [1, 1] | 1
2 | [1, 2] | 3
3 | [3, 3] | 3
4 | [1, 4] | 10
5 | [5, 5] | 5
6 | [5, 6] | 11
7 | [7, 7] | 7
8 | [1, 8] | 36
*/
int k, aib[NMax], n;
int Query(int p)
{
int s = 0;
while(p > 0)
{
s += aib[p];
p -= (p & (-p));
}
return s;
}
void Update(int p, int x)
{
///adauga x la pozitia p
while(p <= n)
{
aib[p] += x;
p += (p & (-p));
}
}
int CautPoz(int s)
{
///ret cea mai din stanga poz. p cu a[1] + a[2] + ... + a[p] = s
int st, dr, mid, p, suma = 0;
p = -1;
st = 1;
dr = n;
while(st <= dr)
{
mid = (st + dr) / 2;
suma = Query(mid);
if(suma == s)
{
p = mid;
dr = mid- 1;
}
else if(suma > s)
dr = mid - 1;
else
st = mid + 1;
}
return p;
}
void Citire()
{
int i, x, y, opt;
fin >> n >> k;
for(i = 1; i <= n; i++)
{
fin >> x;
Update(i, x);
}
for(i = 1; i <= k; i++)
{
fin >> opt;
if(opt == 0)
{
fin >> x >> y;
Update(x, y);
}
else
if(opt == 1)
{
fin >> x >> y;
fout << Query(y) - Query(x - 1) << "\n";
}
else
{
fin >> x;
fout << CautPoz(x) << "\n";
}
}
}
int main()
{
Citire();
return 0;
}