Pagini recente » Istoria paginii utilizator/flslatina95 | Cod sursa (job #134733) | Istoria paginii runda/cade_copacul | Istoria paginii runda/ems2/clasament | Cod sursa (job #1654047)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m;
vector<int> tree(NMAX);
void update(int poz, int val)
{
while(poz <= n)
tree[poz] += val , poz += poz & -poz;
}
int query(int poz)
{
int S = 0;
while (poz)
S += tree[poz], poz -= poz & -poz;
return S;
}
int query2(int val) // binary_search
{
int mij, st = 1, dr = n;
while (st <= dr)
{
mij = (st + dr) >> 1;
if (query (mij) == val)
return mij;
if (query (mij) < val)
st = ++ mij ;
else
dr = -- mij ;
}
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d",&n,&m);
int val;
for(int i = 1 ; i <= n ; ++ i)
scanf("%d",&val), update(i,val);
int op,a,b;
while(m >= 1)
{
scanf("%d ", &op);
switch(op)
{
case 0 : // operatia de tip 0: se adauga la elementul de pe pozitia a valoarea b
scanf("%d%d", &a, &b ) ;
update(a, b);
break;
case 1 : // operatia de tip 1: se determina suma pe intervalul [a,b]
scanf ("%d%d", &a, &b) ;
printf ("%d\n" , query(b)-query(a-1)) ;
break;
case 2 : // operatia de tip 2 : se determina poz minima astfel incat suma sa fie valoarea respectiva
scanf ("%d", &a) ;
printf ("%d \n", query2(a)) ;
break ;
}
-- m ;
}
}