用longlong才能A。。。。。。害我TLE了半天。。。。
用一个结构体记录,操作改变的区间范围 [ c1 , c2 ] , v ,youxiao
注意c1==c2时,并不一定表示一个有效的值所以需要一个标记。。。。
当这个区间表示一个有效的值时,v表示有效值。。。。。否则v表示重复了多少次(用来递推)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const long long int maxn5=1010000;
struct Interval
{
long long int c1,c2,v,youxiao;
}I[maxn5];
long long int n,m,ct,high;
long long int getINT(long long int x)
{
long long int low=0,high=ct-1,mid,ans;
while(low<=high)
{
mid=(low+high)>>1;
if((x>I[mid].c1&&x<I[mid].c2)||x==I[mid].c1||x==I[mid].c2)
{
ans=mid; break;
}
else if(x>I[mid].c2)
{
low=mid+1;
}
else if(x<I[mid].c1)
{
high=mid-1;
}
}
return ans;
}
int main()
{
scanf("%I64d",&m);
while(m--)
{
long long int a,b,c;
scanf("%I64d",&a);
if(a==1)
{
scanf("%I64d",&b);
I[ct++]=(Interval){high,high,b,1};
high++;
}
else if(a==2)
{
scanf("%I64d%I64d",&b,&c);
I[ct++]=(Interval){high,high+c*b-1,c,0};
high=high+c*b;
}
}
scanf("%I64d",&n);
while(n--)
{
long long int x,ans;
scanf("%I64d",&x);
x--;
///>_<
bool flag=true;
while(flag)
{
long long int qj=getINT(x);
if(I[qj].youxiao)
{
ans=I[qj].v;
flag=false;
break;
}
else if(!I[qj].youxiao)
{
int len=x-I[qj].c1;
int jie=(I[qj].c2-I[qj].c1+1)/I[qj].v;
x=len%jie;
}
}
printf("%I64d ",ans);
}
putchar(10);
return 0;
}