Pagini recente » Cod sursa (job #3229615) | Cod sursa (job #2967886) | Cod sursa (job #2795161) | Cod sursa (job #1912493) | Cod sursa (job #711813)
Cod sursa(job #711813)
#include <iostream>
#include <stdio.h>
#define nn 100010
using namespace std;
int n, m, aib[nn], op, A, B, X;
void update(int poz, int val) // op 0
{
int p=0;
while(poz <= n)
{
aib[poz] += val;
while( !(poz & (1<<p) ))
p++;
poz += (1<<p);
p++;
}
}
int suma(int st, int dr) // op 1
{
int s_dr=0, s_st=0, p,poz;
poz=dr, p=0;
while(poz > 0)
{
s_dr += aib[poz];
while( !(poz & (1<<p)))
p++;
poz-=(1<<p);
p++;
}
poz = st-1, p=0;
while(poz > 0)
{
s_st += aib[poz];
while( !(poz & (1<<p)))
p++;
poz-=(1<<p);
p++;
}
return s_dr - s_st;
}
int pmink(int val) // op 2
{
int poz=1;
while (poz < n)
poz = (poz << 1);
for(int i=0 ; poz >0 ; poz = poz>>1)
if(i+poz <= n)
if(val >= aib[i+poz])
{
i+=poz;
val-=aib[i];
if(!val)
return i;
}
return -1;
}
void read_and_solve()
{
freopen ("aib.in","r",stdin);
freopen ("aib.out","w",stdout);
scanf("%d %d", &n, &m);
for(int i=1;i<=n;i++)
{
scanf("%d", &X);
update(i, X);
}
for(int i=0;i<m;i++)
{
scanf("%d", &op);
if(op == 0)
{
scanf("%d %d", &A, &B);
update(A,B);
}
else if(op == 1)
{
scanf("%d %d", &A, &B);
cout << suma(A,B) << "\n";
}
else if (op == 2)
{
scanf("%d", &A);
cout << pmink(A) << "\n";
}
}
}
int main()
{
read_and_solve();
return 0;
}