思路把所有数加上1e5+1,线段树维护每个数×-1的次数
#include<bits/stdc++.h>
#define PII pair<int,int>
#define PLL pair<long long,long long>
#define mkp() make_pair()
#define pbk() push_back()
#define umap unordered_map
#define uset unordered_set
#define ls (x<<1)
#define rs (x<<1|1)
#define lson l,mid,x<<1
#define rson mid+1,r,x<<1|1
#define lowbit(x) x&(-x)
#define debug() cout<<"$\n"
typedef long long ll;
const int N=2e5+5,INF=0x3f3f3f3f;
using namespace std;
int read()
{
int f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
return f*x;
}
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
void print(int x)
{
write(x);
putchar('\n');
}
int n,m;
int a[N];
struct segment_tree
{
int l,r,val,laz_tag;
}t[N<<2];
void push_up(int x)
{
t[x].val=t[ls].val+t[rs].val;
}
void push_down(int x)
{
if(!t[x].laz_tag) return;
t[ls].val+=(t[ls].r-t[ls].l+1)*t[x].laz_tag;
t[rs].val+=(t[rs].r-t[rs].l+1)*t[x].laz_tag;
t[ls].laz_tag+=t[x].laz_tag;
t[rs].laz_tag+=t[x].laz_tag;
t[x].laz_tag=0;
}
void build(int l,int r,int x)
{
t[x].l=l;
t[x].r=r;
if(l==r)
{
t[x].val=0;
return;
}
int mid=l+r>>1;
build(lson);
build(rson);
push_up(x);
}
void update(int nl,int nr,int k,int l,int r,int x)
{
if(nl<=l&&r<=nr)
{
t[x].laz_tag+=k;
t[x].val+=(r-l+1)*k;
return;
}
push_down(x);
int mid=l+r>>1;
if(nl<=mid) update(nl,nr,k,lson);
if(nr>mid) update(nl,nr,k,rson);
push_up(x);
}
int query(int nl,int nr,int l,int r,int x)
{
if(nl<=l&&r<=nr)
{
return t[x].val;
}
push_down(x);
int mid=l+r>>1,res=0;
if(nl<=mid) res+=query(nl,nr,lson);
if(nr>mid) res+=query(nl,nr,rson);
return res;
}
int main()
{
n=read(),m=read();
build(1,200001,1);
for(int i=1;i<=n;i++)
a[i]=read();
while(m--)
{
char op;
cin>>op;
int x=read();
x=x+100001;
if(op=='<')
update(1,x-1,1,1,n,1);
else
update(x+1,200000+1,1,1,n,1);
}
for(int i=1;i<=n;i++)
{
int k=query(a[i]+100001,a[i]+100001,1,n,1);
if(k%2)
print(-1*a[i]);
else
print(a[i]);
}
return 0;
}