Pagini recente » Cod sursa (job #2337302) | Cod sursa (job #671936) | Cod sursa (job #2683977) | Cod sursa (job #2179600) | Cod sursa (job #1610630)
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,unde,cat,st,dr,x,a, c[100001];
void modifica(int ind , int val) // adauga la c[ind] val
{
int poz = 0;
while(ind <= n)
{
c[ind] += val;
while((ind & (1 << poz)) == 0) poz += 1;
ind += 1 << poz;
poz += 1;
}
}
int suma(int ind) // suma de la 1 la ind
{
int s = 0;
int poz = 0;
while(ind > 0)
{
s += c[ind];
while((ind & (1 << poz)) == 0) poz += 1;
ind -= (1 << poz);
poz += 1;
}
return s;
}
int cauta(int sum) //cauti binar
{
int poz = n + 1 , where , val;
int limst = 0, limdr = n + 1;
where = n;
val = suma(where);
if (val == sum) poz = n;
while (where)
{
where = (limst + limdr) / 2;
val = suma(where);
if (val > sum)
{
if (limdr > where) limdr = where;
where--;
}
else if (val == sum) poz = min(poz,where), limdr = where, where--;
else
{
if(limst < where) limst = where;
where++;
}
if (where <= limst) break;
if (where >= limdr) break;
}
if (poz == n + 1) return -1;
return poz;
}
int main()
{
f >> n >> m;
for(int i = 1; i <= n; ++i)
{
f >> x;
modifica(i , x);
}
for(int i = 1; i <= m; ++i)
{
f >> x;
if(x == 0)
{
f >> unde >> cat;
modifica(unde , cat);
}
if(x == 1)
{
f >> st >> dr;
g << suma(dr) - suma(st - 1) << "\n";
}
if(x == 2)
{
f >> a;
g << cauta(a) << "\n";
}
}
return 0;
}