Pagini recente » Cod sursa (job #339317) | Cod sursa (job #3146307) | Cod sursa (job #778383) | Cod sursa (job #1476096) | Cod sursa (job #2581361)
#include <bits/stdc++.h>
#define MAX 100000
using namespace std;
int n;
int v[MAX], aib[MAX];
void update(int idx, int val)
{
while(idx <= n)
{
aib[idx] += val;
idx += (-idx & idx);
}
}
int query(int idx)
{
int suma = 0;
while(idx)
{
suma += aib[idx];
idx -= (-idx & idx);
}
return suma;
}
int sumaInterval(int idx1, int idx2)
{
return query(idx2) - query(idx1 - 1);
}
int findVal(int val)
{
int st = 1, dr = n;
while(st <= dr)
{
int mij = (st + dr) >> 1;
int aux = query(mij);
if(aux == val && query(mij - 1) < val)
return mij;
else if(aux < val)
st = mij + 1;
else dr = mij - 1;
}
return -1;
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
ios::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
srand(time(NULL));
int m;
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
fin >> v[i];
update(i, v[i]);
}
for(int i = 1; i <= m; i++)
{
int c;
fin >> c;
if(c == 2)
{
int a;
fin >> a;
fout << findVal(a) << '\n';
}
else
{
int a, b;
fin >> a >> b;
if(c == 0)update(a, b);
else fout << sumaInterval(a, b) << '\n';
}
}
fin.close();
fout.close();
return 0;
}