#include<stdio.h>
#include<stdlib.h>
struct pos{
int id;/*用于标识当前被谁占用*/
int data;/*存储数据值*/
int pre;/*用于标识前一占用者*/
};
struct pos p[10000000];
int write(int id,int l,int r,int x){
int i;
for(i=l;i<=r;i++){/*边遍历边写入,遇到不能写入的就终止*/
if(p[i].id==0||p[i].id==id){
p[i].id=id;
p[i].data=x;
}else{
break;
}
}
if(i==l){/*如果i等于l,相当于一个都没有改成功,返回-1*/
return -1;
}else{/*其他情况返回i-1,因为此时i总是处于失败位,位于最后一个成功位的右边一位*/
return i-1;
}
}
int deletes(int id,int l,int r){
int i;
for(i=l;i<=r;i++){/*检查是否能删*/
if(p[i].id==id){
continue;
}else{
break;
}
}
if(i>r){/*判断能删后将id置为0,将被删者存入pre*/
for(i=l;i<=r;i++){
p[i].id=0;
p[i].pre=id;
}
return 1;
}
return 0;
}
int recover(int id,int l,int r){
int i;
for(i=l;i<=r;i++){/*判断能否恢复*/
if(p[i].id==0&&p[i].pre==id){
continue;
}else{
break;
}
}
if(i>r){/*判断能恢复后将id恢复即可*/
for(i=l;i<=r;i++){
p[i].id=id;
}
return 1;
}
return 0;
}
int read(int pos){
if(p[pos].id){/*判断是否被占用,被占用即为可读*/
return 1;
}
return 0;
}
int main(){
int n,m,k,i;
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<k;i++){
int flag;
scanf("%d",&flag);
if(flag==0){
int id,l,r,x;
scanf("%d%d%d%d",&id,&l,&r,&x);
printf("%d\n",write(id,l,r,x));
}else if(flag==1){
int id,l,r;
scanf("%d%d%d",&id,&l,&r);
if(deletes(id,l,r)){
printf("OK\n");
}else{
printf("FAIL\n");
}
}else if(flag==2){
int id,l,r;
scanf("%d%d%d",&id,&l,&r);
if(recover(id,l,r)){
printf("OK\n");
}else{
printf("FAIL\n");
}
}else if(flag==3){
int pos;
scanf("%d",&pos);
if(read(pos)){
printf("%d %d\n",p[pos].id,p[pos].data);
}else{
printf("0 0\n");
}
}
}
return 0;
}
CCF 202112-4 磁盘文件操作(C语言,仅过了25%)
最新推荐文章于 2023-05-28 08:05:04 发布