# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
863292 | ibm2006 | Meteors (POI11_met) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx")
using namespace std;
typedef long long int ll;
typedef __int128 lll;
ll n,e,i,j,k,x,z,w,l,r,m,q,a[330000],s,lazy[1100000];
int le[330000],ri[330000];
ll te1,te2,te3;
lll seg[1100000],y;
vector<int> v[330000],u[330000];
pair<int,int> p[330000];
pair<pair<int,int>,ll> upd[330000];
void h(ll x,ll y,ll z)
{
if(lazy[z]==0)
return;
if(z>=524288)
{
seg[z]+=lazy[z];
lazy[z]=0;
return;
}
seg[z]+=(y-x+1)*lazy[z];
lazy[z*2]+=lazy[z];
lazy[z*2+1]+=lazy[z];
lazy[z]=0;
return;
}
void Clear()
{
ll i;
for(i=0;i<1100000;i++)
{
seg[i]=0;
lazy[i]=0;
}
}
void f(ll x,ll y,ll z,ll w)
{
h(x,y,z);
if(l>y||x>r)
return;
if(l<=x&&y<=r)
{
lazy[z]+=w;
h(x,y,z);
return;
}
f(x,(x+y)/2,z*2,w);
f((x+y)/2+1,y,z*2+1,w);
seg[z]=seg[z*2]+seg[z*2+1];
}
lll g(ll x,ll y,ll z)
{
h(x,y,z);
if(l>y||x>r)
return 0;
if(l<=x&&y<=r)
{
return seg[z];
}
return g(x,(x+y)/2,z*2)+g((x+y)/2+1,y,z*2+1);
}
int main()
{
scanf("%lld %lld",&te1,&te2);
n=te1;
m=te2;
for(i=1;i<=m;i++)
{
scanf("%lld",&te1);
x=te1;
//x=1;
v[x].push_back(i);
}
for(i=1;i<=n;i++)
{
scanf("%lld",&te1);
a[i]=te1;
//a[i]=1e9;
}
scanf("%lld",&te1);
q=te1;
for(i=1;i<=q;i++)
{
scanf("%lld %lld %lld",&te1,&te2,&te3);
x=te1;
w=te2;
z=te3;
//x=1; w=m; z=1;
upd[i]={{x,w},z};
}
for(i=1;i<=n;i++)
{
le[i]=1;
ri[i]=q+1;
p[i]={(le[i]+ri[i])/2,i};
}
for(e=0;e<20;e++)
{
//printf("!");
//for(i=1;i<=n;i++)
// printf("(%lld,%lld)\n",le[i],ri[i]);
Clear();
s=1;
for(i=1;i<=q+1;i++)
{
u[i].clear();
}
for(i=1;i<=n;i++)
u[p[i].first].push_back(p[i].second);
for(i=1;i<=q+1;i++)
{
//printf("%lld\n",i);
if(i<=q)
{x=upd[i].first.first;
y=upd[i].first.second;
z=upd[i].second;
if(x<=y)
{
l=x;
r=y;
f(1,524288,1,z);
}
else
{
l=x;
r=m;
f(1,524288,1,z);
l=1;
r=y;
f(1,524288,1,z);
}
}
//printf("?");
for(j=0;j<u[i].size();j++)
{
x=u[i][j];
y=0;
for(k=0;k<v[x].size();k++)
{
l=v[x][k];
r=v[x][k];
y+=g(1,524288,1);}
if(a[x]<=y)
{
ri[x]=i;
}
else
le[x]=i+1;
le[x]=min(le[x],q+1);
// printf("[%lld,%lld]\n",(le[x]+ri[x])/2,x);
p[s]={(le[x]+ri[x])/2,x};
s++;
}
}
//swap(p,pp);
}
for(i=1;i<=n;i++)
{
a[p[i].second]=p[i].first;
}
for(i=1;i<=n;i++)
{
te1=a[i];
if(a[i]>=q+1)
{
printf("NIE\n");
}
else
printf("%lld\n",te1);
}
}