https://codeforc.es/gym/102001/problem/H
思路:字典序最小先全部能改的改成-1,那么先再右边构造1;树状数组维护;
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define sfi(x) scanf("%d",&x)
#define sfc(x) scanf("%c",x)
#define sfl(x) scanf("%lld",&x)
#define sfs(x) scanf("%s",x)
#define lowbit(x) (x)&(-x)
#define pb push_back
#define fl() printf("flag!\n")
#define INF 0x3f3f3f3f
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int maxn=1e5+9;
const int mod=1e9+7;
int n,k;
int a[maxn];
struct Q
{
int l,r,sum;
}q[maxn];
bool cmp(Q x,Q y)
{
if(x.r==y.r) return x.l<y.l;
return x.r<y.r;
}
bool f[maxn];
int tree[maxn<<2];
void add(int x,int val)
{
while(x<=n)
{
tree[x]+=val;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ans=0;
while(x>0)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
//FAST_IO;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]!=0) f[i]=1;
if(a[i]==0) a[i]=-1;
add(i,a[i]);
}
for(int i=1;i<=k;i++)
{
cin>>q[i].l>>q[i].r>>q[i].sum;
}
sort(q+1,q+1+k,cmp);
for(int i=1;i<=k;i++)
{
int l=q[i].l;
int r=q[i].r;
int sum=q[i].sum;
int qsum=getsum(r)-getsum(l-1);
if(qsum<sum)
{
for(int j=r;j>=l&&qsum<sum;j--)
{
if(!f[j])
{
qsum+=2;
add(j,2);
a[j]=1;
f[j]=1;
}
}
}
if(qsum<sum)
{
cout<<"Impossible"<<endl;
return 0;
}
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}