Cod sursa(job #3001861)

Utilizator StefantimStefan Timisescu Stefantim Data 13 martie 2023 23:09:50
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rest.in");
ofstream fout("rest.out");
int n, m, b, p, ans;
const int NMAX = 250005;
int poz, val, start, finish;
int v[NMAX * 4],put[NMAX];

void update(int nod, int st, int dr)
{
    if(st == dr)
    {
        v[nod] = val % p;
        return;
    }
    int mij = (st + dr) / 2;
    if(poz <= mij)
        update(2*nod, st, mij);
    else
        update(2*nod + 1, mij + 1, dr);
    v[nod] = (v[2*nod] * put[dr - mij] + v[2*nod + 1]) % p;
}

void afisare(int nod, int st, int dr)
{
    if(start <= st && dr <= finish)
    {
        ans = (ans*put[dr-st+1] % p + v[nod]) % p;
        return;
    }
    int mij = (st + dr) / 2;
    if(start <= mij)
        afisare(2*nod, st, mij);
    if(mij < finish)
        afisare(2*nod + 1, mij + 1, dr);
}
int main()
{
    int x;
    fin >> n >> b >> p;
    put[0] = 1;
    for(int i = 1; i <= n; i++ )
        put[i] = (put[i-1] * b) % p;
    for(int i = 1; i <= n; i++)
    {
        fin >> x;
        poz = i;
        val = x;
        update(1, 1, n);
    }
    fin >> m;
    for(int i = 1; i <= m; i++)
    {
        fin >> x >> start >> finish;
        if(x == 1)
        {
            poz = start;
            val = finish;
            update(1, 1, n);
        }
        else
        {
            ans = 0;
            afisare(1, 1, n);
            fout << ans << "\n";
        }
    }
    return 0;
}