1 条题解

  • 0
    @ 2026-4-23 8:01:59

    #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
    上传者