Pagini recente » Cod sursa (job #2322513) | Cod sursa (job #2698691) | Cod sursa (job #852737) | Cod sursa (job #730000) | Cod sursa (job #186347)
Cod sursa(job #186347)
#include <fstream>
#include <cstdio>
using namespace std;
#define MAX 100005
int arb[MAX], N,M;
ifstream fin("aib.in");
//ofstream fout("aib.out");
inline int query(int poz)
{
int rez = 0;
for ( ; poz >0; poz -= -poz & poz)
rez+= arb[poz];
return rez;
}
inline void update(int poz, int val)
{
for ( ; poz <=N; poz += -poz & poz)
arb[poz] += val;
}
inline 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;
}
inline 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 )
return poz;
}
}
return -1;
}
int main()
{
freopen("aib.out", "w", stdout);
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";
printf("%d\n", rez);
}
else
{
fin>>a;
//fout<<search2(a)<<"\n";
printf("%d\n", search2(a));
}
}
}