Input
1 //t组样例
5 5 //下一行n个数,q次操作
3 2 1 5 4
1 2 3 //操作1,表示把数组第2个位置变成3,变成 3 3 1 5 4
2 //操作2,表示输出要用几次能把n个数变成0。
1 3 2 //怎么变呢,上例先减1变成2 2 0 4 3,不为0的数减2
1 4 1 //变成0 0 0 2 1,不为0的数减1,变成0 0 0 1 0,
2 //不为0的数减1,全为0,最后全变成0,共需要4次。
Output
4
4
思路:操作2变0,就是看数组里面有几个不为0的数。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const double PI = acos(-1);
const ll M=1e5+7;
const ll mod=1e9+7;
map<ll,ll>m;
ll aa[M];
int main()
{
ll t,i;
scanf("%lld",&t);
while(t--)
{
ll n,p,e,a,b;
m.clear();
ll ans=0;
scanf("%lld%lld",&n,&p);
for(i=1;i<=n;i++)
{
scanf("%lld",&aa[i]);
m[aa[i]]++;
if(m[aa[i]]==1)
ans++;
}
for(i=0;i<p;i++)
{
scanf("%lld",&e);
if(e==1)
{
scanf("%lld%lld",&a,&b);
ll f=aa[a];
aa[a]=b;
m[f]--;
if(m[f]==0)
ans--;
m[b]++;
if(m[b]==1)
ans++;
}
else
{
if(m[0]!=0)
printf("%lld\n",ans-1);
//cout<<ans-1<<endl;
else
printf("%lld\n",ans);
}
}
}
return 0;
}