Pagini recente » Cod sursa (job #2653174) | Cod sursa (job #420462) | Cod sursa (job #2082410) | Monitorul de evaluare | Cod sursa (job #3342206)
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int NMAX = 100000;
int A[NMAX + 1], N, M;
struct FenwickTree
{
int tree[NMAX + 1];
void Update(int poz, int val)
{
while(poz <= N)
{
tree[poz] += val;
poz += poz &-poz;
}
}
int Query(int poz)
{
int sum = 0;
while(poz > 0)
{
sum += tree[poz];
poz &= (poz - 1);
}
return sum;
}
int Query(int st, int dr)
{
if(st > dr)
return 0;
return Query(dr) - Query(st - 1);
}
/// Pozitia minima p: SUM[1..p] >= val
int CautBin(int val)
{
int poz = 0, sum = 0;
/// Determinam poz maxim astfel ca SUM[1..p] < val. Atunci SUM[1..p+1] >= val
for(int bit = 30; bit >= 0; bit--)
if((poz | (1 << bit)) <= N && (sum + tree[poz | (1 << bit)]) < val)
{
poz |= (1 << bit);
sum += tree[poz | (1 << bit)];
}
if(poz + 1 > N || Query(poz + 1) != val)
return -1;
return poz + 1;
}
};
FenwickTree T;
int main()
{
f >> N >> M;
for(int i = 1; i <= N; i++)
{
f >> A[i];
T.Update(i, A[i]);
}
int t, a, b;
while(M--)
{
f >> t;
switch(t)
{
case 0:
f >> a >> b;
T.Update(a, b);
break;
case 1:
f >> a >> b;
g << T.Query(a, b) << '\n';
break;
case 2:
f >> a;
g << T.CautBin(a) << '\n';
}
}
f.close();
g.close();
return 0;
}