Submission #1301689

#TimeUsernameProblemLanguageResultExecution timeMemory
1301689Faisal_SaqibGaraža (COCI17_garaza)C++20
120 / 160
2540 ms6256 KiB
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define ll long long
const int N=1e5+10;
int a[N],seg[4*N],n,q,rp[N],lzy[4*N];
ll seg2[4*N];
void update(int &i,int &v,int l=1,int r=n,int d=1)
{
	if(i<l or r<i)return;
	if(l==r)
	{
		seg[d]=a[i]=v;
		return;
	}
	int m=(l+r)>>1,cl=d<<1,cr=cl|1;
	update(i,v,l,m,cl);
	update(i,v,m+1,r,cr);
	seg[d]=__gcd(seg[cl],seg[cr]);
}
int get(int &ql,int& qr,int l=1,int r=n,int d=1)
{
	if(qr<l or r<ql) return 0;
	if(ql<=l and r<=qr) return seg[d];
	int m=(l+r)>>1,cl=d<<1,cr=cl|1;
	return __gcd(get(ql,qr,l,m,cl),get(ql,qr,m+1,r,cr));
}
void push(int &l,int& r,int& v)
{
	if(lzy[v]!=0)
	{
		seg2[v]=1ll*(r-l+1)*lzy[v];
		if(l!=r) lzy[v*2]=lzy[2*v+1]=lzy[v];
		lzy[v]=0;
	}
}
void Set(int& ql,int& qr,int& v,int l=1,int r=n,int d=1)
{
	push(l,r,d);
	if(qr<l or r<ql) return;
	if(ql<=l and r<=qr){
		lzy[d]=v;
		push(l,r,d);
		return;
	}
	int m=(l+r)>>1,cl=d<<1,cr=cl|1;
	Set(ql,qr,v,l,m,cl);
	Set(ql,qr,v,m+1,r,cr);
	seg2[d]=seg2[cl]+seg2[cr];
}
int getSum(int& ql,int& qr,int l=1,int r=n,int d=1)
{
	push(l,r,d);
	if(qr<l or r<ql) return 0;
	if(ql<=l and r<=qr) return seg2[d];
	int m=(l+r)>>1,cl=d<<1,cr=cl|1;
	return (getSum(ql,qr,l,m,cl)+getSum(ql,qr,m+1,r,cr));
}
void fixit(int x,int v) // lg^4 1e9 tight
{
	int lst=x-1,gt=0;
	while(lst<=n and gt!=1) // lg(1e9)
	{
		int l,r;
		{
			int s=lst,e=n+1;
			while(s+1<e)
			{
				int mid=(s+e)/2;
				if(get(x,mid)==gt)
				{
					s=mid;
				}
				else{
					e=mid;
				}
			}
			r=s;
		}
		{
			int lst1=x-1,gt1=__gcd(gt,a[x-1]);
			while(lst1>=1 and gt1!=1) // O(lg 1e9)
			{
				int s=0,e=lst1;
				while(s+1<e)
				{
					int mid=(s+e)/2;
					if(get(mid,r)==gt1)
					{
						e=mid;
					}
					else{
						s=mid;
					}
				}
				Set(e,lst1,r);
				lst1=e-1;
				gt1=get(lst1,r);
			}
		}
		Set(x,x,r);
		lst=r+1;
		gt=get(x,lst);
	}
}
long long f(int x)
{
	return (1ll*x*(x+1))/2;
}
int32_t main()
{
	ios::sync_with_stdio(0);
	cout.tie(0);
	cin.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		update(i,a[i]);
	}
	for(int i=n;i>=1;i--)
	{
		rp[i]=(i==n)?n:rp[i+1];
		while(rp[i]>=i and get(i,rp[i])==1)rp[i]--;
		Set(i,i,rp[i]);
	}
	while(q--)
	{
		int t;
		cin>>t;
		if(t==1)
		{
			int x,v;
			cin>>x>>v;
			update(x,v);
			fixit(x,v);
		}
		else
		{
			int l,r;
			cin>>l>>r;
			long long ans=0;
			int s=l-1,e=r+1;
			while(s+1<e)
			{
				int mid=(s+e)/2;
				if(getSum(mid,mid)>=r)
				{
					e=mid;
				}
				else{
					s=mid;
				}
			}
			int c=r+1-e;
			ans+= 1ll*r*c - (f(r)-f(r-c)) + c;
			e--;
			ans+=getSum(l,e);
			ans+=(e-l+1);
			ans-=(f(e)-f(l-1));
			cout<<ans<<'\n';
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...