Cod sursa(job #856640)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 16 ianuarie 2013 20:15:16
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<fstream>
#include<algorithm>
#include<vector>

using namespace std;

const int Nmax = 15001;

ifstream f("datorii.in");
ofstream g("datorii.out");

int V[Nmax], N, M, Q, rad, lo, hi, poz, val;
vector<int> st, dr, arb;

void update() {

    int i;

    V[poz] -= val;
    for(i=1; i<=Q; ++i)
        if(st[i] <= poz && poz <= dr[i]) {
            arb[i] -= val;
            break;
        }
}

int query() {

    int i, sum, left, right;

    sum = 0;
    left = 1<<30;
    right = -1;

    for(i=1; i<=Q; ++i) {
        if(lo <= st[i] && dr[i] <= hi) {
            left = min(left, st[i]);
            right = max(right, dr[i]);
            sum += arb[i];
        }
        if(dr[i] > hi)
            break;
    }

    for(i=lo; i<left; ++i)
        sum += V[i];
    for(i=right+1; i<=hi; ++i)
        sum += V[i];

    return sum;
}

void build() {

    int i, j;

    for(rad=1; rad*rad<=N; ++rad);
    --rad;
    Q = N/rad + 1;

    st.resize(Q+1);
    dr.resize(Q+1);
    arb.resize(Q+1);

    for(i=1; i<=Q; ++i) {
        arb[i] = 0;
        st[i] = rad*(i-1)+1;
        dr[i] = rad*i;
        for(j=st[i]; j<=dr[i]; ++j)
            arb[i] += V[j];
    }
}

int main() {

    int i, op;

    f>>N>>M;
    for(i=1; i<=N; ++i)
        f>>V[i];

    build();

    while(M--) {
        f>>op;
        if(op == 1) {
            f>>lo>>hi;
            g<<query()<<"\n";
            continue;
        }
        if(op == 0) {
            f>>poz>>val;
            update();
            continue;
        }
    }

    f.close();
    g.close();

    return 0;
}