Pagini recente » Cod sursa (job #2591824) | Cod sursa (job #182264) | Cod sursa (job #295893) | Cod sursa (job #2431090) | Cod sursa (job #186344)
Cod sursa(job #186344)
#include <fstream>
using namespace std;
#define MAX 100005
int arb[MAX], N,M;
ifstream fin("aib.in");
ofstream fout("aib.out");
int query(int poz)
{
int rez = 0;
for ( ; poz >0; poz -= ( poz ^ (poz-1)) & poz)
rez+= arb[poz];
return rez;
}
void update(int poz, int val)
{
for ( ; poz <=N; poz += (poz ^ (poz-1)) & poz)
arb[poz] += val;
}
int search( int sum )
{
int st = 1, dr = N, poz=-1;
while ( st <= dr )
{
int mid = (st + dr ) >> 1;
int c = query(mid);
if ( c == sum )
return mid;
if ( c < sum )
st = mid +1;
else
dr = mid - 1;
}
return poz;
}
int search2 ( int sum )
{
int poz, st;
for ( st = 1; st <= N; st <<= 1);
for ( poz = 0; st; st >>= 1)
{
if ( poz + st <= N && sum >= arb[poz+st] )
{
poz+= st;
sum -= arb[poz];
if ( sum == 0 )
return poz;
}
}
return -1;
}
int main()
{
fin>>N>>M;
for (int i =1; i<=N; i++)
{
int aux;
fin>>aux;
update(i,aux);
}
for ( ; M>0; M--)
{
int op, a,b;
fin>>op;
if ( op == 0)
{
fin>>a>>b;
update(a,b);
}
else
if ( op == 1)
{
fin>>a>>b;
int rez = query(b) - query(a-1);
fout<<rez<<"\n";
}
else
{
fin>>a;
fout<<search2(a)<<"\n";
}
}
}