Pagini recente » Cod sursa (job #2106812) | Cod sursa (job #2416331) | Cod sursa (job #1575032) | Cod sursa (job #2073078) | Cod sursa (job #2783564)
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream cin ("aib.in") ;
ofstream cout("aib.out") ;
/// suma pt a-b va fi suma 1->b - suma 1->a-1
long long v[100009], arbore[100009], biti_la_sf[100009] ;
long long S(int k)
{
long long sum = 0 ;
while(k)
{
sum += arbore[k] ;
k -= biti_la_sf[k] ;
}
return sum ;
}
long long suma(int st, int dr)
{
return S(dr) - S(st - 1) ;
}
long long sp[100009] ;
int main()
{
int n, q ;
cin >> n >> q ;
for(int f = 1 ; f <= n ; f ++)
biti_la_sf[f] = (f & (f * -1)) ; /// este o putere a lui 2 direct
for(int f = 1 ; f <= n ; f ++)
{
cin >> v[f] ;
sp[f] = sp[f - 1] + v[f] ;
for(int indice = f ; indice <= n ; indice += biti_la_sf[indice])
{
arbore[indice] += v[f] ;
indice += biti_la_sf[indice] ; /// acel biti_la_sf este direct puterea lui 2
}
}
vector<int> spp ;
for(int f = 1 ; f <= n ; f ++)
spp.push_back(sp[f]) ;
while(q --)
{
int a, b, c ;
cin >> a ;
if(a == 0)
{
cin >> b >> c ; /// la elem de pe poz b se adauga c
int indice = b ;
while(indice <= n)
{
arbore[indice] += c ;
indice += biti_la_sf[indice] ;
}
}
if(a == 1)
{
int st, dr ;
cin >> st >> dr ;
cout << "" << suma(st, dr) << "\n" ;
}
if(a == 2)
{
long long s ;
cin >> s ;
int st = 1, dr = n ;
while(st <= dr)
{
int mid = (st + dr) / 2 ;
if(s > S(mid))st = mid + 1 ;
else dr = mid - 1 ;
}
st = (st + dr) / 2 ;
while(S(st) == s)st -- ;
if(S(st + 1) != s)cout << -1 << '\n' ;
else
cout << st + 1 << '\n' ;
}
}
return 0;
}