ZT15 小红的区间查询

发布于:2025-02-27 ⋅ 阅读:(16) ⋅ 点赞:(0)

描述

小红拿到了一个仅由正整数组成的数组,她有以下两种操作:

1. 输入1 i x,代表将第i个正整数修改为x。
2. 输入2 i x,代表查询前i个正整数有多少个数等于x。

输入描述:

第一行输入两个正整数n和q,代表数组长度和操作次数。
第二行输入n个正整数ai​,代表初始的数组。
接下来的q行,每行输入三个正整数op,i,x,用空格隔开,其中op代表操作的类型,i和x的含义见题目描述。
1≤n,q,ai​,x≤200
1≤op≤2
1≤i≤n
保证至少有1次询问操作。

输出描述:

对于每次询问,输出一个整数,代表查询的结果。

示例1

输入:

5 3
1 2 3 4 5
2 3 1
1 1 2
2 3 1

输出:

1
0

说明:

第一次为查询操作,此时数组为[1,2,3,4,5],前三个数中有一个1。
第二次为修改操作,将数组修改为[2,2,3,4,5]。
第三次为查询操作,此时数组为[2,2,3,4,5],前三个数中没有1。
一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.有一个数组

2.可以对数组进行两种操作

3.第一种操作是将i位置的值修改为x

4.第二种操作是查询前i个位置中值等于x的数字有多少

5.输出查询结果

二、解题思路

1.首先读取数据

2.根据操作符号不同,对数组进行相关的操作

三、具体步骤

使用的语言是C

#include <stdio.h>
#include <stdlib.h>
int main() {
    int n, q;
    if (scanf("%d %d", &n, &q) != EOF) {
        // printf("n is %d q is %d\n", n, q);
        int* a = (int*)malloc(sizeof(int) * n);
        for(int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        int op, i ,x;
        for(int time = 0; time < q; time++) {
            scanf("%d %d %d", &op, &i, &x);
            // printf("%d %d %d\n", op, i, x);
            if(op == 1) { // 代表是修改操作
                a[i - 1] = x;
            } else if(op == 2) { // 查询操作
                int count = 0;
                for(int j = 0; j < i; j++) {
                    if(a[j] == x) count++;
                }
                printf("%d\n", count);
            } else {
                printf("error2");
            }
        }
        free(a);
    } else {
        printf("error");
    }
    return 0;
}