Pagini recente » Cod sursa (job #3038474) | Cod sursa (job #283010) | Cod sursa (job #1978220) | Cod sursa (job #685017) | Cod sursa (job #3192727)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define limn 100010
int tree[limn];
int n, m, a, b, qtype, x;
void add(int poz, int val) {
for(int i = poz; i <= n; i += i&(-i))
tree[i] += val;
}
int sum(int poz) {
int result = 0;
for(int i = poz; i > 0; i -= i&(-i))
result += tree[i];
return result;
}
int minPos(int val) {
int mask = 1;
while(mask <= n) mask<<=1;
mask>>=1;
int position = 0;
for(; mask > 0; mask >>= 1) {
if(position + mask <= n && tree[position+mask] <= val) {
val -= tree[position + mask];
position += mask;
if(val == 0)
return position;
}
}
return -1;
}
int main()
{
fin>>n>>m;
for(int i = 1; i <= n; i++) { // citim sirul si construim arborele initial
fin>>x;
for(int j = i; j <= n; j += (j&(-j)))
tree[j] += x;
}
while(m--) {
fin>>qtype;
if(qtype == 0) {
fin>>a>>b;
add(a, b);
}
if(qtype == 1) {
fin>>a>>b;
fout<<sum(b)-sum(a-1)<<'\n';
}
if(qtype == 2) {
fin>>a;
fout<<minPos(a)<<'\n';
}
}
fin.close();
return 0;
}