1 条题解
-
0

#include <bits/stdc++.h> #define st first #define en second #define N 100034 using namespace std; typedef long long ll; typedef pair <int, int> pr; struct opr{ int id, k, b; opr (int id0 = 0, int k0 = 0, int b0 = 0): id(id0), k(k0), b(b0) {}; bool operator < (const opr &b) const {return id < b.id;} }; int cx, n, mod, q; int a[N]; int q0, i, j; int ch, lj, rj, k, b; int cnt, tim, ans; pr rg[N << 2]; // segment_tree of timestamp opr op[5122020]; int add(int id, int L, int R){ if(L == R){ // set st's value rg[id].st = cnt; op[cnt++] = opr(0, 1, 0); op[cnt++] = opr(lj, k, b); op[cnt++] = opr(rj + 1, 1, 0); if(rj < n) op[cnt++] = opr(n + 1, 0, 0); rg[id].en = cnt; return 1; } int M = L + R - 1 >> 1, i, j, K, B, pos; pr lr, rr; tim <= M ? add(id << 1, L, M) : add(id << 1 | 1, M + 1, R); // recursion if(tim == R){ // st union rg[id].st = cnt; lr = rg[id << 1]; rr = rg[id << 1 | 1]; for(pos = 0, i = lr.st + 1, j = rr.st + 1; i < lr.en || j < rr.en; ){ K = (ll)op[i - 1].k * (ll)op[j - 1].k % mod; B = ((ll)op[i - 1].b * (ll)op[j - 1].k + (ll)op[j - 1].b) % mod; op[cnt++] = opr(pos, K, B); if(i < lr.en && j < rr.en && op[i].id == op[j].id){ pos = op[i].id; ++i; ++j; }else if(j >= rr.en || (i < lr.en && op[i].id < op[j].id)) pos = op[i++].id; else pos = op[j++].id; } if(op[cnt - 1].id < n + 1) op[cnt++] = opr(n + 1, 0, 0); rg[id].en = cnt; } return 0; } int range(int id, int L, int R){ if(lj <= L && R <= rj){ // calculate opr o(j, 0, 0), *oo = upper_bound(op + rg[id].st, op + rg[id].en, o) - 1; ans = ((ll)ans * oo->k + oo->b) % mod; return 1; } int M = L + R - 1 >> 1; if(lj <= M) range(id << 1, L, M); // recursion if(rj > M) range(id << 1 | 1, M + 1, R); } int main(){ scanf("%d%d%d", &cx, &n, &mod); cx = -(cx & 1); for(i = 1; i <= n; i++) scanf("%d", a + i); scanf("%d", &q); q0 = min(q, 100000); cnt = tim = ans = 0; for(i = 0; i < q; i++){ scanf("%d%d%d", &ch, &lj, &rj); if(cx){lj ^= ans; rj ^= ans;} if(ch == 1){ ++tim; scanf("%d%d", &k, &b); add(1, 1, q0); }else{ scanf("%d", &j); j ^= (cx & ans); ans = a[j]; //printf("a[%d] = %d\n", j, ans); range(1, 1, q0); printf("%d\n", ans); } } return 0; }
- 1
信息
- ID
- 5486
- 时间
- 8000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者