Pagini recente » Cod sursa (job #1080253) | Cod sursa (job #2826357) | Cod sursa (job #3247333) | Cod sursa (job #2835371) | Cod sursa (job #1213268)
#include <fstream>
#include <iostream>
#define in "aib.in"
#define out "aib.out"
#define dim 100001
int N, M, X;
int Tree[dim];
int C, S;
void actualizare(int poz, int val)
{
C = 0;
while(poz <= N)
{
Tree[poz] += val;
while ( !(poz & (1<<C)) ) C++;
poz += (1<<C);
C += 1;
}
}
int interogare(int poz)
{
C = 0; S = 0;
while(poz > 0)
{
S += Tree[poz];
while( !(poz & (1<<C)) ) C++;
poz -= (1<<C);
C += 1;
}
return S;
}
int cautare(int val)
{
int k = 1;
while(k < N)
k <<= 1;
for(int i = 0; k; k >>= 1)
{
if(i + k <= N)
{
if(val >= Tree[i + k])
{
i += k;
val -= Tree[i];
if(!val)
return i;
}
}
}
return -1;
}
int main()
{
std :: ifstream f (in);
std :: ofstream g (out);
f >> N >> M;
int x;
for(int i = 1; i <= N; i++)
{
f >> x;
actualizare(i, x);
}
int p, q;
while(M != 0)
{
f >> x;
if(x < 2)
{
f >> p >> q;
if( !x )
actualizare(p, q);
else
g << interogare(q) - interogare(p-1) << "\n";
}
else
{
f >> p;
g << cautare(p) << "\n";
}
M--;
}
return 0;
}