- 1000ms
- 262144K
贝壳找房的销售顾问每天要带客户看很多房源,这对他们来说是一件体力活,所以他们要经常进行户外拓展来增强体力。
这一次他们进行的拓展是在一个 n \times mn×m 的矩形地图方格地图上玩游戏,最初,地图是空的。
游戏一共进行 qq 轮,第 ii 轮,会是以下操作之一
假设在这之前有 k-1k−1 次 11 操作,在 (l,y)(l,y) 到 (r,y)(r,y) 线段之间每个格子里面摆放一个属于第 kk 组的石子,保证操作之前 yy 这一行没有其他的棋子。
某人从 (x,l)(x,l) 沿着直线走到 (x,r)(x,r),最开始他的愉悦值是 00,每当他遇到组 jj 的棋子,他的愉悦值会从 xx 变为 p_jx+q_jpjx+qj,输出走完之后这个人的愉悦值。
删除某一组棋子。
所有输出对 323232323323232323(质数)取模。
输入格式
第一行三个整数 n,m,qn,m,q,分别表示地图的长,宽和游戏的轮数。
接下来 qq 行,每行一个操作。
每行首先一个字母表示操作的类型。
如果是'I'
,表示一次 11 操作,接下来就五个整数 l_i,r_i,y_i,p_i,q_ili,ri,yi,pi,qi,前三个描述摆放的位置,后两个描述对愉悦值的影响。
如果是'Q'
,表示一次 22 操作,接下来有三个整数,x_i,l_i,r_ixi,li,ri 表示人行走的路径。
如果是'D'
,表示一次 33 操作,接下来有一个整数 ii,表示将第 ii 次摆放的石子移出棋盘。
保证 n,m,q \le 1000n,m,q≤1000, 1 \le l_i \le r_i \le n1≤li≤ri≤n, 1 \le y_i \le m1≤yi≤m, 0 \le p_i,q_i \le 3232323230≤pi,qi≤323232323。并且 33 操作中组 ii 的石子一定都在地图内。走路中 1 \le x_i \le n1≤xi≤n, 1 \le l_i \le r_i \le m1≤li≤ri≤m。
输出格式
对于每次 22 操作,输出一行一个整数,表示走完后此人的愉悦值。
样例输入
3 3 6 I 1 2 2 1 1 Q 1 1 3 I 1 3 1 1 2 Q 1 1 3 D 1 Q 3 1 3
样例输出
1 3 2
以后再战
#include<stdio.h>
#include<string.h>
int build[1001][1001];
int k,j;
struct step{
int l1[1001];
int r1[1001];
int y1[1001];
int p1[1001];
int q1[1001];
};
void I(int l1,int r1,int y1,int p1,int q1){
for(k=l1;k<=r1;k++){
build[y1][k]=1;
}
}
void Q(int x2,int l2,int r2){
result=0;
for(j=l2;j<=r2;j++){
if(build[j][x2]=1)
result=p1*result+q1;
}
}
void D(int i){
for(k=l1[i];k<=r1[i];k++){
build[y1[i]][k]=0;
}
}
int main(void){
int n,m,t;
char c;
int l1,r1,y1,p1,q1;
int x2,l2,r2;
int h=0;
memset(build,sizeof(build),0);
scanf("%d",&t);
while(t--){
scanf("%c",&c);
if(c=='I'){
h++;
scanf("%d%d%d%d%d",&l1[h],&r1[h],&y1[h],&p1[h],&q1[h]);
I(l1[h],r1[h],y1[h],p1[h],q1[h]);
else if(c=='Q'){
scanf("%d%d%d",&x1,&l1,&r1);
Q(x2,l2,i2);
printf("%d\n",result);
}
else if(c=='D'){
scanf("%d",&i);
I(i);
}
}
}