Pagini recente » Cod sursa (job #805064) | Cod sursa (job #1653099) | Cod sursa (job #193552) | Cod sursa (job #2147058) | Cod sursa (job #174364)
Cod sursa(job #174364)
#include <cstdio>
#define DIM 100020
using namespace std;
int N, M, K, X, Y, A[DIM];
int bit(int x);
void Update (int P, int V);
int Query(int P);
int BinSearch(int V);
int main()
{
FILE *fin = fopen("aib.in", "r");
FILE *fout = fopen("aib.out", "w");
fscanf(fin, "%d%d", &N, &M);
for (int i = 1; i <= N; i++)
{
fscanf(fin, "%d", &X);
Update(i, X);
}
for (int i = 1; i <= M; i++)
{
fscanf(fin, "%d", &K);
if (K == 0)
{
fscanf(fin, "%d%d", &X, &Y);
Update(X, Y);
}
if (K == 1)
{
fscanf(fin, "%d%d", &X, &Y);
fprintf(fout, "%d\n", Query(Y) - Query(X - 1));
}
if (K == 2)
{
fscanf(fin, "%d", &X);
fprintf(fout, "%d\n", BinSearch(X));
}
}
fclose(fin);
fclose(fout);
return 0;
}
int bit (int x)
{
return (x & (x - 1)) ^ x;
}
void Update(int P, int V)
{
for (int i = P; i <= N; i += bit(i))
A[i] += V;
}
int Query(int P)
{
int sol = 0;
for (int i = P; i > 0; i -= bit(i))
sol += A[i];
return sol;
}
int BinSearch(int V)
{
int st = 1, dr = N, p = DIM;
while (st <= dr)
{
int pivot = (st + dr) / 2, sum = Query(pivot);
if (sum == V)
{
p = p < pivot ? p : pivot;
dr = pivot - 1;
}
else if (sum > V)
dr = pivot - 1;
else
st = pivot + 1;
}
return p == DIM ? -1 : p;
}