Topic link
topic
Solution: The
person who wrote the question wrote the solution quite well, so you can use it.
Code:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int>pii;
const int MAXN=5e5+5;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double pi=acos(-1);
struct Node
{
int l,r;
int minn;
}node[MAXN<<2];
int nex[MAXN];
int last[MAXN];
int a[MAXN];
int vis[1000005];
void push_up(int num)
{
node[num].minn=min(node[num<<1].minn,node[num<<1|1].minn);
}
void build(int l,int r,int num)
{
node[num].l=l;
node[num].r=r;
if(l==r)
{
node[num].minn=nex[l];
//cout<<l<<" "<<nex[l]<<endl;
return;
}
int mid=(l+r)/2;
build(l,mid,num<<1);
build(mid+1,r,num<<1|1);
push_up(num);
}
int query(int l,int r,int num)
{
if(node[num].l>=l&&node[num].r<=r)
{
return node[num].minn;
}
int ans=1e9;
int mid=(node[num].l+node[num].r)>>1;
if(l<=mid)
{
ans=min(ans,query(l,r,num<<1));
}
if(r>mid)
{
ans=min(ans,query(l,r,num<<1|1));
}
return ans;
}
void updata(int pos,int x,int num)
{
if(node[num].l==node[num].r)
{
node[num].minn=x;
return;
}
int mid=(node[num].l+node[num].r)>>1;
if(pos<=mid)
{
updata(pos,x,num<<1);
}
else
{
updata(pos,x,num<<1|1);
}
push_up(num);
}
int main()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(!vis[a[i]])
{
last[i]=0;
vis[a[i]]=i;
}
else
{
last[i]=vis[a[i]];
nex[vis[a[i]]]=i;
vis[a[i]]=i;
}
}
for(int i=1;i<=n;i++)
{
if(!nex[i])
{
nex[i]=n+1;
}
}
build(1,n,1);
//cout<<query(1,1,1)<<endl;
//cout<<endl;
// for(int i=1;i<=n;i++)
// {
// cout<<i<<" "<<last[i]<<" "<<nex[i]<<" "<<query(i,i,1)<<endl;
// }
//cout<<endl;
int op,x,l,r;
while(q--)
{
cin>>op;
if(op==1)
{
cin>>x;
nex[last[x]]=nex[x];
updata(last[x],nex[x],1);
last[nex[x]]=last[x];
last[x]=0;nex[x]=n+1;
updata(x,n+1,1);
//cout<<query(2,2,1)<<endl;
// cout<<endl;
// for(int i=1;i<=n;i++)
// {
// cout<<i<<" "<<last[i]<<" "<<nex[i]<<endl;
// }
// cout<<endl;
}
else
{
cin>>l>>r;
int ans=query(l,r,1);
//cout<<ans<<" "<<"wd"<<endl;
if(ans<=r) printf("1\n");
else printf("0\n");
}
}
}