Cod sursa(job #1310251)

Utilizator florinasAsavei florinas Data 6 ianuarie 2015 16:59:01
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <cmath>
using namespace std;
int n, Q, v[15100], rad, suma[205], bucata[15100];
 inline void Update(int poz, int val)
{
    v[poz] -= val;
    suma[bucata[poz]] -= val;
}
 inline int Query(int st, int dr)
{
    int rez = 0;
    while(bucata[st] != bucata[dr])
    {
        if(st % rad == 1)
        {
            rez += suma[bucata[st]];
            st += rad;
        }
        else
        {
            while(st % rad != 1)
            {
                rez += v[st];
                st++;
            }
        }
    }
    while(st <= dr)
    {
        rez += v[st];
        st++;
    }
    return rez;
}

int main()
{
    int i, j, tip, A, B;
    ifstream fin("datorii.in");
    ofstream fout("datorii.out");
    fin >> n >> Q;
    for(i = 1; i <= n; ++i)
        fin >> v[i];

    rad = (int)sqrt(1.0 * n) + 1;
    j = 1;
    for(i = 1; i <= n; ++i)
    {
        bucata[i] = j;
        suma[j] += v[i];
        if(i % rad == 0)
            j++;
    }

    while(Q--)
    {
        fin >> tip >> A >> B;
        if(tip == 0)
            Update(A, B);
        if(tip == 1)
            fout << Query(A, B) << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}